【问题标题】:entity framework - many to many relationship实体框架 - 多对多关系
【发布时间】:2011-12-17 12:15:15
【问题描述】:

您好,我尝试使用与 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。行为正确吗?

【问题讨论】:

  • @Ladislav:没什么。当我创建多对多关系时,我问这是否是常见的 EF 行为。你是斯洛伐克人还是切什人?
  • 是的,我是捷克人。据我了解您的问题,行为是正确的。
  • @Ladislav:我在你的博客上读了几篇关于 EF 的文章,干得好 :)

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多