ef core 2.1 много ко многим - PullRequest
       9

ef core 2.1 много ко многим

0 голосов
/ 31 октября 2018

У меня есть 4 таблицы, которые я пытаюсь создать в EF Core 2.1, с их отношениями

Производство имеет одного или нескольких лиц в роли. например В постановке «Гамильтон» есть человек в роли режиссера,

Production
ProductionId     Name        
------------     -----------
PR1               Hamilton

Person
PersonId         Name
--------         -----------
P1               Rick
P2               Chris
P3               Dan

Role
RoleId           Name
----------       -----------
R1               Director
R2               Choreographer
R3               Actor

ProductionRolePerson
ProductionId    PersonId    RoleId
------------    --------    ------
PR1             P1 (Rick)   R1 (Director)
PR1             P2 (Chris)  R2 (Choreographer)
PR1             P3 (Dan)    R3 (Actor)


Production 
    | 1
    | *
ProductionPersonRole
| *             | *
| 1             | 1
Person         Role

Я не могу понять, как правильно установить отношения один ко многим.

Вот классы, которые я настроил:

 public class Production 
    {
        public int ProductionId { get; set; }
        public List<ProductionPersonRole> Roles { get; set; }
    }

    public class Person 
    {
        public int PersonId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public ICollection<ProductionPersonRole> ProductionPersonRoles { get; set; }
    }

public class Role
    {
        public int RoldId { get; set; }
        public string Name {get;set;}
        public ICollection<ProductionPersonRole> Jobs { get; set; }
    }

public class ProductionPersonRole
    {
        public Production Production { get; set; }
        public Person Person { get; set; }
        public Role Role { get; set; }
    }

Вот класс DbContext:

    public class MyContext : DbContext
        {
            public DbSet<Production> Productions { get; set; }
            public DbSet<ProductionPersonRole> ProductionPersonRoles { get; set; }
            public DbSet<Role> Roles { get; set; }
            public DbSet<Person> Persons { get; set; }

            public MyContext(): base()
            {

            }

            public MyContext(DbContextOptions options): base(options)
            {

            }

            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<ProductionPersonRole>()
                    .HasKey(ppr => new {ppr.Production.ProductionId, ppr.Person.PersonId, ppr.Role.RoldId});

                modelBuilder.Entity<ProductionPersonRole>()
                    .HasOne(ppr => ppr.Production)
                    .WithMany(ppr => ppr.Roles)
                    .HasForeignKey(ppr => ppr.Production.ProductionId);

                modelBuilder.Entity<ProductionPersonRole>()
                    .HasOne(ppr => ppr.Person)
                    .WithMany(ppr => ppr.ProductionPersonRoles)
                    .HasForeignKey(ppr => ppr.Person.PersonId);

                modelBuilder.Entity<ProductionPersonRole>()
                    .HasOne(ppr => ppr.Role)
                    .WithMany(ppr => ppr.Jobs)
                    .HasForeignKey(ppr => ppr.Role.RoleId);

                base.OnModelCreating(modelBuilder);
            }
}

Я направляюсь в правильном направлении?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Дизайн в порядке. Но беглой конфигурации нет. EF Core не позволяет использовать вложенные свойства внутри плавного API, поэтому использование методов HasKey и HasForeignKey приведет к исключению времени выполнения.

Поскольку ваша модель соответствует соглашениям EF Core, и все отношения описаны с использованием свойств навигации на обоих концах, EF Core сможет автоматически определять практически все без любой свободной конфигурации, кроме составного первичного ключа объекта объединения. Это единственное, что требует плавной конфигурации.

Хотя можно настроить составной ПК только с теневыми свойствами (зная соглашения EF Core для именования свойств FK, например public Person Person -> int PersonId):

modelBuilder.Entity<ProductionPersonRole>()
     .HasKey("ProductionId", "PersonId", "RoleId");

Я бы порекомендовал добавить явные свойства FK к объекту соединения:

public class ProductionPersonRole
{
    public int ProductionId { get; set; }
    public int PersonId { get; set; }
    public int RoleId { get; set; }
    public Production Production { get; set; }
    public Person Person { get; set; }
    public Role Role { get; set; }
}

и использовал вместо него следующую конфигурацию:

modelBuilder.Entity<ProductionPersonRole>()
     .HasKey(ppr => new { ppr.ProductionId, ppr.PersonId, ppr.RoleId });

Он не только позволяет избежать использования жестко закодированных строк, но также может быть очень полезен при вставке / удалении ссылок в отключенных сценариях.

0 голосов
/ 31 октября 2018

Да, просто проверьте архитектуру БД. Потому что, если не правильно, EF создаст БД с другой архитектурой.

...