C# 实体框架核心中的循环模型
假设这些模型是社交网络应用程序的一部分。用户可以创建一个组,并可以在itas成员中添加其他用户,并且用户可以是该组的成员。我使用的是.net核心和实体框架核心 型号: Fluent API: 当我要迁移到数据库时,会发生以下错误: 在表“GroupMembers”上引入外键约束“FK_GroupMembers\u Users\u UserId”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束或索引。请参阅前面的错误 但是,我可以在SQLServer中手动创建此模型,并且没有问题。C# 实体框架核心中的循环模型,c#,sql-server,asp.net-core,entity-framework-core,ef-fluent-api,C#,Sql Server,Asp.net Core,Entity Framework Core,Ef Fluent Api,假设这些模型是社交网络应用程序的一部分。用户可以创建一个组,并可以在itas成员中添加其他用户,并且用户可以是该组的成员。我使用的是.net核心和实体框架核心 型号: Fluent API: 当我要迁移到数据库时,会发生以下错误: 在表“GroupMembers”上引入外键约束“FK_GroupMembers\u Users\u UserId”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束或索引。请参阅前面的错误 但是,我可以
至少有两种方法可以解决这个问题。但我想知道为什么英孚核心说,有一个循环。问题是什么 我想你的桥牌有问题 试试这个
public class GroupMember: BaseEntity
{
public User User { get; set; }
[Key, Column(Order = 0)]
public int UserId { get; set; }
public Group Group { get; set; }
[Key, Column(Order = 1)]
public int GroupId { get; set; }
}
不是EF core这么说的。这是SQL Server,所以不能逃避,修复它。当然。你的权利。SQL server允许我手动创建,但EF core不允许?这不是EF core的限制,而是SQL server。请注意错误消息中的单词cascade。手动创建的模型在一个或多个关系上没有级联删除。因此,在EF Core中也要这样做-更改一个或多个DeleteBehavior.Cascade到DeleteBehavior.Restrict,您将得到相同的数据库模型。我的意思是它实际上没有循环。我的问题不是谁说的错误。它不是循环的,而是从用户到组成员的多个级联路径:1个用户->组->组成员,2个用户->组成员。我知道在现实中,所有者永远不会是所属组的成员,但是没有办法告诉关系数据库这一点,因此它将其视为可能,并反过来导致级联删除问题。顺便说一句,这是SqlServer,可能是其他一些数据库限制-例如Oracle在没有任何问题的情况下处理这些事情。您测试过吗?@GertArnold是的,我在大多数项目中都使用这种模式。您可以轻松添加其他字段。但我不确定桥接表是否可以从其他表继承。@GertArnold刚刚检查了派生类,您可以自由使用继承。它起作用了!此外,您还可以为表选择任何名称。这是否解决了问题?我认为它仍然会创建级联外键。使用问题中的精确模型,使用EF核心?
modelBuilder.Entity<User>()
.HasMany(x => x.OwnGroups)
.WithOne(x => x.OwnerUser).HasForeignKey(x => x.OwnerUserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<User>()
.HasMany(x => x.MemberInGroups)
.WithOne(x => x.User).HasForeignKey(x => x.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<Group>()
.HasMany(x => x.Members)
.WithOne(x => x.Group).HasForeignKey(x => x.GroupId).IsRequired().OnDelete(DeleteBehavior.Cascade);
public class GroupMember: BaseEntity
{
public User User { get; set; }
[Key, Column(Order = 0)]
public int UserId { get; set; }
public Group Group { get; set; }
[Key, Column(Order = 1)]
public int GroupId { get; set; }
}