实体框架 - 多对多的关系

时间:2011-10-28 18:24:39

标签: c# many-to-many entity-framework-4.1 entity-relationship

您好我尝试与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");
                     });

这在DB中创建了ProjectsAuthors表。这是我对这种关系映射案例的第一次尝试。

如果我省略了这个映射,它创建了具有类似模式的表AuthorProject。这是正确的bevahior?

1 个答案:

答案 0 :(得分: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,那么它也是正确的行为。