entity framework – 多对多的关系

嗨,我尝试与EF Fluent API使用多对多关系。 我有2个POCO课程。

public class Project { public int ProjectId { get; set; } public virtual ICollection Authors { get; set; } public Project() { Authors = new List(); } } public class Author { public int AuthorId { get; set; } public virtual ICollection Projects { get; set; } public Author() { Projects = new List(); } } 

我将这部分代码映射到很多很多关系:

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

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

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

经过反复试验,我发现了以下内容。 鉴于两个class级……

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

…没有像这样的Fluent映射和DbContext ……

 public class MyContext : DbContext { public DbSet AClasses { get; set; } public DbSet BClasses { get; set; } } 

…创建的连接表的名称是BClassAClasses 。 如果我改变集合的顺序……

 public class MyContext : DbContext { public DbSet BClasses { get; set; } public DbSet AClasses { get; set; } } 

…创建的连接表的名称更改为AClassBClasses ,表中的键列顺序也会更改。 因此,连接表的名称和键列的顺序似乎取决于实体类“加载”到模型中的顺序 – 如果有更多关系,则可以是DbSet声明的顺序或其他顺序涉及 – 例如一些其他实体AClass

最后,它根本不重要,因为这种多对多关系是“对称的”。 如果您想拥有自己的连接表名称,可以像以前一样在Fluent API中指定它。

那么,对于您的问题:是的,命名连接表AuthorProjects是正确的行为。 如果名称是ProjectAuthors那么它也是正确的行为。