структура сущности - отношения многие ко многим - PullRequest
3 голосов
/ 28 октября 2011

Привет, я пытаюсь использовать отношения «многие ко многим» с 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 с похожей схемой. Это правильно bevahior?

1 Ответ

6 голосов
/ 29 октября 2011

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

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; }
}

... и нет сопоставления Fluent и подобный 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, это было бы также правильным поведением.

...