我首先在我的项目中使用实体代码。基本上我有 3 个类 Users
、Branchs
和 UsersBranchs
。
Users
包含 UserID
、Name
、...
Branchs
包含 BranchID
、Location
、... 和 UserID(指分支的创建者)
UsersBranchs
只有两列 BranchID 和 UserID,定义哪个用户位于哪个分支
问题是我收到此错误:
'FK_dbo.UsersBranchs_dbo.Users_UsersID' on table 'UsersBranchs' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
你能帮我吗?
更新
这是 UsersBranchs 类
[ForeignKey("UserID")]
public CoreUsers User { get; set; }
public Guid UsersID { get; set; }
[ForeignKey("BranchID")]
public Branchs Branch { get; set; }
public Guid BranchID { get; set; }
并将此行添加到 DbContext 类以使用 UserID 和 BranchID 作为键
modelBuilder.Entity<UsersBranchs>().HasKey(x => new { x.UserID, x.BranchID });
Branchs Class is
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid ID { get; set; }
[ForeignKey("UserID")]
public CoreUsers User { get; set; }
public Guid UserID { get; set; }
public .....
用户类别是
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid ID { get; set; }
public .....
最佳答案
无法 handle multiple cascade paths和 cascade delete to same table长期以来一直是 Sql Server 的限制。只需 Google 一下错误消息即可。基本上,如果您想使用级联删除,那么您必须确保只有一个级联路径。
目前,您有两条路径:分支 -> UsersBranchs 和分支 -> 用户 -> UsersBranchs。
EF 默认设置级联删除,但可以通过删除 DbContext 中的约定来停止它。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Manually set cascade delete behaviour
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
然后,您必须在想要级联删除的任何关系上设置 WillCascadeOnDelete(true)。请参阅Entity Framework documentation .
除此之外,你的模型看起来有点奇怪。您看起来像是在尝试创建一个多对多链接/联接表 UsersBranchs,但分支上也有一个用户,这实际上没有意义。在这种情况下,您是否还需要 UsersBranchs 表?您是否打算在分支上拥有一组用户,即导航属性而不是外键,从而提供一对多关系分支 -> 用户?
顺便说一句,我真的不喜欢对单个实体使用复数。
关于c# - Entity Framework 、外键约束可能会导致循环或多条级联路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27792131/