【问题标题】:MVC 4 Entity Framework Two Foreign Keys to the Same Table Cause cycles or multiple cascade pathsMVC 4 Entity Framework 同一个表的两个外键导致循环或多个级联路径
【发布时间】:2016-08-02 07:51:27
【问题描述】:

我有 2 个实体 UnitUnitPerUnit。他们的角色是:

  • Unit :定义单位,如公斤、米、厘米、码等...
  • UnitPerUnit :保存单位之间的值(例如:1kg = 1000gr)

代码如下:

[Table("EA_Unit", Schema = "EAccounting")]
public class EA_Unit
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Display(Name = "Unit Id")]
    public int UnitId { get; set; }

    [Display(Name = "Unit Name")]
    [Index("UnitName", IsUnique = true)]
    [MaxLength(20)]
    [Required]
    public string UnitName { get; set; } //Example kg, piece, roll, yard, meter

    public EA_Unit()
    {
        UnitName = "";
    }
}

[Table("EA_UnitPerUnit", Schema = "EAccounting")]
public class EA_UnitPerUnit
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Display(Name = "Unit Per Unit Id")]
    public int UnitPerUnitId { get; set; }

    [Display(Name = "From Unit")]
    [Required]
    [Index("UnitToUnit", 1, IsUnique = true)]
    public int UnitId { get; set; }

    [Display(Name = "To Name")]
    [Required]
    [Index("UnitToUnit", 2, IsUnique = true)]
    public int UnitToUnit { get; set; } //The comparer unit

    [Display(Name = "Amount")]
    [Required]
    public float UnitAmount { get; set; } //how much is this unit to another unit (ex: 1kg = 1000gr)

    [ForeignKey("UnitId")]
    public virtual EA_Unit Unit { get; set; }

    [ForeignKey("UnitToUnit")]
    public virtual EA_Unit UnitTo { get; set; }

    public EA_UnitPerUnit()
    {
        UnitId = 0;
        UnitToUnit = 0;
        UnitAmount = 0;
    }
}

每当我运行程序并创建数据库时,都会出现这个错误:

在表“EA_UnitPerUnit”上引入 FOREIGN KEY 约束“FK_EAccounting.EA_UnitPerUnit_EAccounting.EA_Unit_UnitToUnit”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束。查看以前的错误。

我想要的是,如果Unit 被删除,那么在public virtual EA_Unit Unit { get; set; }public virtual EA_Unit UnitTo { get; set; } 中保存已删除Unit 值的UnitPerUnit 条目也将被删除。

我该如何克服这个问题?我想设置数据库,这样数据库会在删除Unit 条目后自动删除UnitPerUnit 条目。

【问题讨论】:

  • 使一个 FK 非级联。

标签: c# asp.net-mvc entity-framework asp.net-mvc-4


【解决方案1】:

这个问题已经一次又一次地解决了。请参考this answer

具有级联删除的外键意味着如果父项中的记录 表被删除,则子表中对应的记录 会被自动删除。这在 SQL 中称为级联删除 服务器。

参考link

您需要使用模型构建器来解决此问题。

modelBuilder.Entity<...>()
            .HasRequired(...)
            .WithMany(...)
            .HasForeignKey(...)
            .WillCascadeOnDelete(false);

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();   

【讨论】:

  • 所以我应该在 UnitPerUnit 或 Unit 上添加模型构建器?因为EA_Unit没有UnitPerUnit的信息,只有自己的数据。
  • 如果我错了,请纠正我,所以我的模型的问题是我有 2 个外键,并且在删除时都有级联到同一个单元,这会导致系统检查 2 次是否是一个单元被删除,这是系统阻止的,所以解决方案是只有1个外键在删除时具有级联对吗?如果另一个没有级联但映射到它的单元被删除的外键,我可能必须手动删除 UnitPerUnit,对吗?
  • 这就是问题所在。如果您可以重新设计表结构,那将是理想的,但如果绝对需要为同一个表使用不同的 FK,那么只需禁用级联删除。这是一个不完美的解决方案,因为如果您删除了父级而子级仍然存在,那么您可以将子级数据视为孤立数据。你不希望这样。在删除时禁用级联将影响实体而不是外键本身。还不如在父数据之前删除所有子数据。在处理复杂关系时仍然是一个好习惯。
猜你喜欢
  • 2020-06-14
  • 2016-03-26
  • 1970-01-01
  • 2014-01-12
  • 2015-04-26
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多