3 c# entity-relationship many-to-many 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>();
}
}
Run Code Online (Sandbox Code Playgroud)
我用这部分代码映射了很多很多关系:
////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");
});
Run Code Online (Sandbox Code Playgroud)
这在DB中创建了ProjectsAuthors表.这是我对这种关系映射案例的第一次尝试.
如果我省略了这个映射,它创建了具有类似模式的表AuthorProject.这是正确的bevahior?
经过反复试验,我发现了以下内容.鉴于两个班级......
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; }
}
Run Code Online (Sandbox Code Playgroud)
...没有像这样的Fluent映射和DbContext ......
public class MyContext : DbContext
{
public DbSet<AClass> AClasses { get; set; }
public DbSet<BClass> BClasses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
...创建的连接表的名称是BClassAClasses.如果我改变集合的顺序......
public class MyContext : DbContext
{
public DbSet<BClass> BClasses { get; set; }
public DbSet<AClass> AClasses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
...创建的连接表的名称更改为AClassBClasses,表中的键列顺序也会更改.因此,连接表的名称和键列的顺序似乎取决于实体类"加载"到模型中的DbSet顺序 - 如果涉及更多关系,则可以是声明的顺序或另一个顺序- 例如一些其他实体参考AClass.
最后,它根本不重要,因为这种多对多关系是"对称的".如果您想拥有自己的连接表名称,可以像以前一样在Fluent API中指定它.
那么,对于你的问题:是的,命名连接表AuthorProjects是正确的行为.如果名称已经存在,ProjectAuthors那么它也是正确的行为.