gpt4 book ai didi

c# - Entity Framework - 多对多关系

转载 作者:行者123 更新时间:2023-11-30 14:38:25 24 4
gpt4 key购买 nike

您好,我尝试将多对多关系与 EF Fluent API 结合使用。我有 2 个 POCO 类(class)。

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

这在数据库中创建了表 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; }
}

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

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

...创建的连接表的名称更改为AClassBClasses,并且表中键列的顺序也发生变化。因此,连接表的名称和键列的顺序似乎取决于实体类“加载”到模型中的顺序——这可以是 DbSet 声明的顺序如果涉及更多关系,则为另一个顺序 - 例如,一些其他实体引用 AClass

到头来根本无所谓,因为这样的多对多关系是“对称”的。如果您想拥有自己的连接表名称,您可以像之前那样在 Fluent API 中指定它。

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

关于c# - Entity Framework - 多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com