“引入 FOREIGN KEY 约束”
Posted
技术标签:
【中文标题】“引入 FOREIGN KEY 约束”【英文标题】:"Introducing FOREIGN KEY constraint" 【发布时间】:2014-03-20 08:38:03 【问题描述】:使用:VS 2013,Entity Framework Code First,ASP.NET Web Project MVC
我有 2 个模型,同一个表需要 2 个 FK:
public class A
public int Id get; set;
public string Name get; set;
public class B
public int Id get; set;
public int Id1 get; set;
[ForeignKey("Id1")]
public virtual A A1 get; set;
public int Id2 get; set;
[ForeignKey("Id2")]
public virtual A A2 get; set;
在enable-migration
和Add-Migration Test
之后,当我运行Update-Database
时,我收到以下消息:
在表“B”上引入 FOREIGN KEY 约束“FK_dbo.B_dbo.A_Id2”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
【问题讨论】:
我认为,属性是多余的,因为 EF 将 Id1 和 Id2 道具视为适当实体的键。 【参考方案1】:使用此代码
public class A
public int Id get; set;
public string Name get; set;
public class B
public int Id get; set;
public int Id1 get; set;
[ForeignKey("Id1")]
public virtual A A1 get; set;
public int Id2 get; set;
[ForeignKey("Id2")]
public virtual A A2 get; set;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Entity<B>()
.HasRequired(e => e.A1)
.WithMany()
.HasForeignKey(c => c.Id1)
.WillCascadeOnDelete(false)
.HasRequired(e => e.A2)
.WithMany()
.HasForeignKey(c => c.Id2)
.WillCascadeOnDelete(false)
;
你也可以使用 inverseProperty 属性。
【讨论】:
你是对的,但也许你可以向读者解释是什么造成了不同。此外,通过流畅的映射,您可以不使用属性。 当两个表有很多关系时,你必须使用fluent api来设置.WillCascadeOnDelete(false),而通过数据注释你不能这样做。 我使用您的解决方案,并进行了一些小改动:在 OnModelCreating 中调用 base.OnModelCreating(modelBuilder) 并删除 B 类中的 ForeignKey 注释。对我来说真正奇怪的是,如果我将相同的类 A 和 B 以及 OnModelCreating 中的相同代码放入另一个项目中,Add-Migration 添加了几个字段:A1_Id = c.Int(),A2_Id = c.Int (),A_Id = c.Int(),A_Id1 = c.Int(),.ForeignKey("dbo.A", t => t.A1_Id).ForeignKey("dbo.A", t => t.A2_Id ).ForeignKey("dbo.A", t => t.A_Id).ForeignKey("dbo.A", t => t.A_Id1)以上是关于“引入 FOREIGN KEY 约束”的主要内容,如果未能解决你的问题,请参考以下文章
错误:引入FOREIGN KEY约束可能会导致循环或多个级联路径
SQL Server 引入 FOREIGN KEY 约束可能导致循环或多个级联路径
Entity Framework Core 5 - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径
ASP.Net MVC 3 EF“在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径”
在表“ReservedSeats”上引入 FOREIGN KEY 约束“FK_ReservedSeats_Seats_SeatId”可能会导致循环或多个级联路径
在表“tblMaintenance”上引入 FOREIGN KEY 约束“FK2CustomerId”可能会导致循环或多个级联路径