实体框架-多对多关系

本文关键字:关系 框架 实体 | 更新日期: 2023-09-27 18:12:46

嗨,我尝试使用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");
                     });

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

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

实体框架-多对多关系

经过反复试验,我发现了以下内容。给定两个类…

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

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

public class MyContext : DbContext
{
    public DbSet<BClass> BClasses { get; set; }
    public DbSet<AClass> AClasses { get; set; }
}

…创建的连接表的名称更改为AClassBClasses,表中键列的顺序也更改。因此,连接表的名称和键列的顺序似乎取决于实体类"加载"到模型中的顺序——可以是DbSet声明的顺序,也可以是涉及更多关系时的另一个顺序——例如引用AClass的其他实体。

最后,这一点都不重要,因为这样的多对多关系是"对称的"。如果你想拥有自己的连接表名,你可以在Fluent API中指定它,就像你已经做的那样。

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