实体框架 - 多对多关系

3

你好,我尝试使用EF Fluent API实现多对多关系。我有两个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表。这样做正确吗?


@Ladislav:没有什么。我只是问一下,当我创建多对多关系时,这是否是常见的EF行为。你是斯洛伐克人还是捷克人? - user572844
是的,我是捷克人。根据我理解你的问题,这种行为是正确的。 - Ladislav Mrnka
@Ladislav:我在你的博客上读了一些有关EF的文章,做得好 :) - user572844
1个回答

6

通过试错,我找到了以下方法。给定两个类...

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,那也是正确的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接