Объединение таблиц/файлов

Сначала я использую код структуры сущностей и сопоставляю наши файлы unidata с таблицами для получения данных. Я хочу присоединиться к таблицам или использовать свойства навигации. Две таблицы имеют общее поле WorkInProgressOperationId. Я пытался использовать свойства соединения и навигации, но, похоже, это не работает при сопоставлении с файлами unidata. Возможно ли это?

        public class WorkInProgressMapping : EntityTypeConfiguration<WorkInProgress>
{

    public WorkInProgressMapping()
    {          
        this.ToTable("WIPMASTER");
        this.HasKey(e => e.WorkInProgressId).Ignore(e => e.EntityId);           
        this.Property(e => e.WorkInProgressId).HasColumnName("@ID");
        this.Property(e => e.SequenceNumber).HasColumnName("OPER_SEQ_NBR");
        this.Property(e => e.WorkOrderNumber).HasColumnName("WORK_ORDER");
        this.Property(e => e.StartQuantity).HasColumnName("SCHED_COMP_QTY");
        this.Property(e => e.JobNumber).HasColumnName("JOB_NBR");
        this.Property(e => e.JobDetailId).HasColumnName("JOBDET_ID");
        this.Property(e => e.ComputerGeneratedNumber).HasColumnName("CPN");
        this.Property(e => e.ItemNumber).HasColumnName("ITEM_NBR");
        this.Property(e => e.ParentWorkOrder).HasColumnName("PARENT_WO");
        this.Property(e => e.ParentDueDate).HasColumnName("SCHED_COMP_DATE");
        this.Property(e => e.WorkOrderIssueDate).HasColumnName("RELEASE_DATE");
        this.Property(e => e.WorkInProgressOperationId).HasColumnName("WIPOPERACT_ID");
    }
}

        public class WorkInProgressOperationMapping : EntityTypeConfiguration<WorkInProgressOperation>
{

    public WorkInProgressOperationMapping()
    {
       this.ToTable("WIPOPER");
       this.HasKey(e => e.WorkInProgressOperationId).Ignore(e => e.EntityId);
       this.Property(e => e.WorkInProgressOperationId).HasColumnName("@ID");
       this.Property(e => e.OperationNumber).HasColumnName("OPERATION_NBR");
       this.Property(e => e.OperationSequence).HasColumnName("OPER_SEQ");
       this.Property(e => e.WorkOrder).HasColumnName("WORK_ORDER");
       this.Property(e => e.NextSequence).HasColumnName("NEXT_SEQ");
       this.Property(e => e.Status).HasColumnName("OPER_STATUS");
       this.Property(e => e.QuantityComplete).HasColumnName("QTY_COMPLETE");
       this.Property(e => e.SalesOrderDeliveryDate).HasColumnName("DUE_SO");
       this.Property(e => e.WorkOrderDeliveryDate).HasColumnName("WO_DUE");
       this.Property(e => e.StartingQuantity).HasColumnName("EXP_START_QTY");

    }
}

person James Morris    schedule 17.01.2014    source источник
comment
В нашем примере (предоставляется при установке) у нас есть класс Unidata «Student.cs» для Code First. Вы пробовали это? Набор инструментов U2 для .NET версии 1.3.0 не поддерживает Entity Framework 6.0. Вы разрабатываете с использованием EF 6.0? Является ли этот класс «EntityTypeConfiguration» только для EF 6.0? Не могли бы вы предоставить мне свой пример? Я попытаюсь смоделировать с нашей «демонстрационной» учетной записью Unidata. Мне нужно отладить код с вашим примером. Пожалуйста, пришлите мне свой код на [email protected]. Раджан Кумар   -  person Rajan Kumar    schedule 18.01.2014
comment
Пожалуйста, пришлите мне файл ошибки и лог-файл на это письмо: [email protected]   -  person Rajan Kumar    schedule 18.01.2014


Ответы (3)


Другой пример: отношение «один ко многим» (таблицы/файлы U2)

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test_EF5
{


    public class Customer
    {
        public string CustomerID { get; set; }
        public string FirstName { get; set; }

        public virtual ICollection<Rental> Rentals { get; set; }
    }

    public class Rental
    {
        public string RentalID { get; set; }
        public string CustomerID { get; set; }
        public decimal Balance { get; set; }
        public virtual Customer Customer { get; set; }
    }

    public class CustomerMapping : EntityTypeConfiguration<Customer>
    {
        public CustomerMapping()
        {
            this.ToTable("MEMBERS");
            this.Property(e => e.CustomerID).HasColumnName("MEMBERS_PK");
            this.Property(e => e.FirstName).HasColumnName("FIRST_NAME");
            this.HasKey(e => e.CustomerID);
        }

    }

    public class RentalMapping : EntityTypeConfiguration<Rental>
    {
        public RentalMapping()
        {
            this.ToTable("RENTAL_DETAILS");
            this.Property(e => e.RentalID).HasColumnName("RENTAL_DETAIL_PK");
            this.Property(e => e.Balance).HasColumnName("BALANCE.DUE");
            this.Property(e => e.CustomerID).HasColumnName("CUSTOMER.CODE");


            this.HasKey(e => new { e.RentalID });
            HasRequired(p => p.Customer)
                .WithMany(b => b.Rentals)
                .HasForeignKey(p => new { p.CustomerID });

        }

    }

    public class CustomerContext : DbContext
    {
        public CustomerContext()
        {

        }
        public DbSet<Customer> Customers { get; set; }
        public DbSet<Rental> Rentals { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Configurations.Add(new CustomerMapping());
            modelBuilder.Configurations.Add(new RentalMapping());

        }
    }
}
person Rajan Kumar    schedule 21.01.2014

Мне удалось поместить свойство навигации между двумя таблицами UniData. Я использовал составной ключ/внешний ключ. Это ваше требование?

См. пример ниже.

Я использовал следующее:

База данных U2

  • ЮниДата 7.3
  • Демо-счет с таблицами STUDENT_NF_SUB и STUDENT_CGA_MV_SUB
  • Демо-счет нормализован с помощью VSG

Майкрософт

  • Visual Studio 2012, обновление 4
  • .NET Framework 4.5
  • Entity Framework 5.0 (установочный пакет Entity Framework — версия 5.0.0)
  • Код первой модели
  • Приложение WinFrom

Таблица UniData в обозревателе серверов

См. ниже таблицы Unidata в обзоре сервера Visual Studio 2012.

SE.png

Модель и код DbContext

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test_EF5
{
    public class Student
    {
        public string StudentID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public virtual ICollection<StudentSemester> Semesters { get; set; }
    }

    public class StudentSemester
    {
        public string StudentID { get; set; }
        public string Semester { get; set; }
        public int CompositeKey { get; set; }
        public virtual Student Student { get; set; }
    }
    public class StudentMapping : EntityTypeConfiguration<Student>
    {
        public StudentMapping()
        {
            this.ToTable("STUDENT_NF_SUB");
            this.Property(e => e.StudentID).HasColumnName("ID");
            this.Property(e => e.FirstName).HasColumnName("FNAME");
            this.Property(e => e.LastName).HasColumnName("LNAME");
            this.HasKey(e => e.StudentID);
        }

    }

    public class StudentSemesterMapping : EntityTypeConfiguration<StudentSemester>
    {
        public StudentSemesterMapping()
        {
            this.ToTable("STUDENT_CGA_MV_SUB");
            this.Property(e => e.StudentID).HasColumnName("ID");
            this.Property(e => e.Semester).HasColumnName("SEMESTER");
            this.Property(e => e.CompositeKey).HasColumnName("CGA_MV_KEY");
            this.HasKey(e => new { e.StudentID, e.CompositeKey });

        }

    }
    public class StudentContext : DbContext
    {
        public StudentContext()
        {

        }
        public DbSet<Student> Students { get; set; }
        public DbSet<StudentSemester> StudentSemesters { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Configurations.Add(new StudentMapping());
            modelBuilder.Configurations.Add(new StudentSemesterMapping());

        }
    }
}

Приложение WinForm для вызова кода сначала с помощью свойства навигации

private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                Database.SetInitializer<StudentContext>(null);
                StudentContext ctx = new StudentContext();
                var r = ctx.Students.ToList();
                foreach (var item in r)
                {
                    this.textBox1.AppendText("ID="+item.StudentID+" FNAME=" + item.FirstName +" LNAME="+ item.LastName +Environment.NewLine);

                    foreach (var item2 in item.Semesters)
                    {
                        this.textBox1.AppendText("\t ID="+item2.StudentID + " Semester="+item2.Semester +" CompositeKey="+ item2.CompositeKey +Environment.NewLine);
                    }
                }
            }
            catch (Exception e4)
            {
                string lErr = e4.Message;
                this.textBox1.AppendText(lErr);
            }

        }

Запустите приложение

RunApp.png

person Rajan Kumar    schedule 19.01.2014
comment
Спасибо Раджан за пример кода. Я попробую сегодня. - person James Morris; 20.01.2014
comment
Rajan. В файле Uidata файла WIPMASTER есть поле с именем WIPOPERACT_ID, которое соответствует идентификатору файла WIPOPER, а в файле WIPOPER есть поле WORK_ORDER, которое соответствует файлу WIPMASTER. Могу ли я установить связь между одним WIPMASTER и многими WIPOPERS с этими двумя таблицами? Если да, то как мне сопоставить Haskeys? - person James Morris; 20.01.2014
comment
Да, я думаю, что это возможно. HasRequired(),WithMany() и HasForeignKey() позволяют создать отношение один (WIPMASTER) ко многим (WIPOPERS). Не могли бы вы добавить следующие строки в Class WorkInProgressOperationMapping и повторить попытку? HasKey(e => new { e. WorkInProgressOperationId }); HasRequired(p => p.WorkInProgress) .WithMany(b => b. WorkInProgressOperation) .HasForeignKey(p => new { p. WORK_ORDER }); - person Rajan Kumar; 21.01.2014
comment
Не забудьте добавить этот код в Class WorkInProgress и Class WorkInProgressOperation. Класс WorkInProgress { общедоступный виртуальный ICollection‹ WorkInProgressOperation › WorkInProgressOperations { get; задавать; } } Класс WorkInProgressOperation { общедоступный виртуальный WorkInProgress WorkInProgress { get; задавать; } } - person Rajan Kumar; 21.01.2014
comment
Последний пример сработал для меня, Раджан. Из любопытства, сколько поездок будет сделано в БД с использованием свойств навигации при запросе 2 таблиц. Я ценю вашу помощь. - person James Morris; 21.01.2014
comment
Привет, Джеймс, спасибо. Я рад, что это сработало для вас. Вы можете использовать функцию Include() для выполнения жадной загрузки. Он совершит один обход сервера и получит данные таблиц «WorkInProgressOperation» и «WIPMASTER». См. выше исходный код функции Include(). - person Rajan Kumar; 22.01.2014

Нетерпеливая загрузка с помощью функции Include()

private void button3_Click(object sender, EventArgs e)
        {


            try
            {
                Database.SetInitializer<CustomerContext>(null);
                CustomerContext ctx = new CustomerContext();
                var r = ctx.Customers.Include("Rentals").ToList();
                foreach (var item in r)
                {
                    this.textBox1.AppendText("ID=" + item.CustomerID + " FNAME=" + item.FirstName + Environment.NewLine);
                    int k = 0;
                    foreach (var item2 in item.Rentals)
                    {
                        this.textBox1.AppendText("\t ID=" + item2.RentalID + " CustomerID=" + item2.CustomerID + " Balance=" + item2.Balance + Environment.NewLine);

                    }
                }

                int y = 0;
            }
            catch (Exception e4)
            {
                string lErr = e4.Message;
                this.textBox1.AppendText(lErr);
            }

        }
person Rajan Kumar    schedule 22.01.2014