entity framework — отношения «многие ко многим»

#c# #many-to-many #entity-framework-4.1 #entity-relationship

#c# #многие ко многим #entity-framework-4.1 #сущность-отношение

Вопрос:

Привет, я пытаюсь использовать отношения «Многие ко многим» с EF Fluent API. У меня есть 2 класса POCO.

 public class Project
{
    public int ProjectId { get; set; }

    public virtual ICollection<Author> Authors { get; set; }

    public Project()
    {
        Authors = new List<Author>();
    }
}

public class Author
{
    public int AuthorId { get; set; }

    public virtual ICollection<Project> Projects { get; set; }

    public Author()
    {
        Projects = new List<Project>();
    }
}
 

И я сопоставляю отношения «многие ко многим» с этой частью кода:

         ////MANY TO MANY 
        modelBuilder.Entity<Project>()
            .HasMany<Author>(a => a.Authors)
            .WithMany(p => p.Projects)
            .Map(m =>
                     {
                         m.ToTable("ProjectAuthors");
                         m.MapLeftKey("ProjectId");
                         m.MapRightKey("AuthorId");
                     });
 

Это создало таблицу ProjectsAuthors в БД. Это моя первая попытка в этом случае сопоставления отношений.

Если я опустил это сопоставление, оно создало таблицу AuthorProject с аналогичной схемой. Это правильно или нет?

Комментарии:

1. @Ladislav: Ничего. Я спросил, является ли это обычным поведением EF, когда я создаю отношения «многие ко многим». Вы словак или Cezch ?

2. Да, я чех. Насколько я понимаю ваш вопрос, поведение правильное.

3. @Ladislav: Я прочитал несколько статей о EF в вашем блоге, хорошая работа 🙂

Ответ №1:

Методом проб и ошибок я обнаружил следующее. Даны два класса…

 public class AClass
{
    public int Id { get; set; }
    public ICollection<BClass> BClasses { get; set; }
}

public class BClass
{
    public int Id { get; set; }
    public ICollection<AClass> AClasses { get; set; }
}
 

… и нет свободного сопоставления и DbContext, подобного этому…

 public class MyContext : DbContext
{
    public DbSet<AClass> AClasses { get; set; }
    public DbSet<BClass> BClasses { get; set; }
}
 

…имя созданной таблицы соединений — BClassAClasses . Если я изменю порядок наборов…

 public class MyContext : DbContext
{
    public DbSet<BClass> BClasses { get; set; }
    public DbSet<AClass> AClasses { get; set; }
}
 

…имя созданной таблицы соединений изменяется на AClassBClasses, а также изменяется порядок ключевых столбцов в таблице. Итак, имя таблицы соединений и порядок ключевых столбцов, по-видимому, зависят от порядка, в котором классы сущностей «загружаются» в модель, что может быть порядком DbSet объявлений или другим порядком, если задействовано больше отношений — например, какой-либо другой объект, ссылающийся на AClass .

В конце концов, это вообще не имеет значения, потому что такое отношение «многие ко многим» является «симметричным». Если вы хотите иметь собственное имя таблицы соединений, вы можете указать его в Fluent API, как вы уже делали.

Итак, на ваш вопрос: да, присвоение имени таблице соединений AuthorProjects является правильным поведением. Если бы имя было ProjectAuthors , это тоже было бы правильным поведением.