【问题标题】:"Introducing FOREIGN KEY constraint"“引入 FOREIGN KEY 约束”
【发布时间】: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 道具视为适当实体的键。

标签: entity-framework code-first


【解决方案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)
猜你喜欢
  • 2019-10-05
  • 2018-08-08
  • 2013-07-23
  • 1970-01-01
  • 2016-11-04
  • 2023-03-22
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多