“引入 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-migrationAdd-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”可能会导致循环或多个级联路径