c# - 实体框架核心中的模型循环
问题描述
想象一下这些模型是社交网络应用程序的一部分。User
可以创建一个Group
并且可以在其中添加其他用户(作为成员),并且用户可以是该组的成员。我正在使用 .net 核心和实体框架核心。
楷模:
public class User : BaseEntity
{
public string UserName { get; set; }
public IList<Group> OwnGroups { get; set; }
public IList<GroupMember> MemberInGroups { get; set; }
}
public class Group : BaseEntity
{
public string Name { get; set; }
public int OwnerUserId { get; set; }
[ForeignKey("OwnerUserId")]
public User OwnerUser { get; set; }
public IList<GroupMember> Members { get; set; }
}
public class GroupMember : BaseEntity
{
public int GroupId { get; set; }
public int UserId { get; set; }
[ForeignKey("UserId")]
public User User { get; set; }
[ForeignKey("UserId")]
public Group Group { get; set; }
}
流畅的 API:
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);
当我想迁移到数据库时,会发生这个错误:
在表“GroupMembers”上引入 FOREIGN KEY 约束“FK_GroupMembers_Users_UserId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。请参阅以前的错误。
但是,我可以手动制作这个模型,没有问题。
SQL Server
至少有两种方法可以修复它。但我想知道为什么EF Core
说,有一个循环。问题是什么?
解决方案
我认为您的桥接表(连接点)有问题。
尝试这个
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; }
}
推荐阅读
- node.js - 为什么这 2 个 NodeJS / Typescript 导入会给出不同的结果?
- c++ - How to draw graph for a trajectory which goes left and right in x axis?
- r - R:通过附加列对数据框进行分组
- facebook - FB 移动画布应用程序/游戏重定向到外部网站
- apache-kafka - Kafka 消费组突然停止在实例之间平衡消息
- python-3.x - add_widget创建后如何访问widget?
- sql - 如何设计数据库并使电话成为与另一个(员工)有关系的表
- ios - UIBarButtonItem 以编程方式创建而不是点击和链接
- javascript - 使用垂直鼠标滚轮在 React 组件上水平滚动
- c# - 来自 BV 代码的 WebRequest 以调用服务并发送多个变量