Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心中的循环模型_C#_Sql Server_Asp.net Core_Entity Framework Core_Ef Fluent Api - Fatal编程技术网

C# 实体框架核心中的循环模型

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”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束或索引。请参阅前面的错误 但是,我可以

假设这些模型是社交网络应用程序的一部分。用户可以创建一个组,并可以在itas成员中添加其他用户,并且用户可以是该组的成员。我使用的是.net核心和实体框架核心

型号:

Fluent API:

当我要迁移到数据库时,会发生以下错误:

在表“GroupMembers”上引入外键约束“FK_GroupMembers\u Users\u UserId”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束或索引。请参阅前面的错误

但是,我可以在SQLServer中手动创建此模型,并且没有问题。


至少有两种方法可以解决这个问题。但我想知道为什么英孚核心说,有一个循环。问题是什么

我想你的桥牌有问题

试试这个

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