2016-08-02 63 views
0

我有2個實體UnitUnitPerUnit。他們的角色是:MVC 4實體框架對同一個表的兩個外鍵導致週期或多個級聯路徑

  • 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被刪除,即持有的價值UnitPerUnit條目要麼public virtual EA_Unit Unit { get; set; }或刪除public virtual EA_Unit UnitTo { get; set; }Unit也將被刪除。

我該如何克服這個問題?我想設置數據庫,數據庫將在Unit條目被刪除後自動刪除UnitPerUnit條目。

+1

讓一個FK非級聯。 –

回答

1

此問題已被一再解決。請參閱this answer

與級聯刪除的外鍵意味着,如果在父 表中的記錄被刪除,然後在子表 相應的記錄將被自動刪除。這在SQL 服務器中稱爲級聯刪除。

參考link

您將需要使用模型生成器來解決此問題。

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

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
+0

所以我應該在UnitPerUnit或Unit上添加模型生成器?因爲EA_Unit沒有UnitPerUnit的信息,所以它只有自己的數據。 –

+0

EA_UnitPerUnit如錯誤中所述。 –

+0

如果我錯了,糾正我,所以我的模型的問題是,我有2個外鍵,並且兩個級聯刪除到同一個單元,導致系統檢查2次單元是否被刪除,這是阻止系統,所以解決方案是隻有一個級聯刪除權的外鍵?也許我必須手動刪除UnitPerUnit,如果沒有級聯但映射到它的單元的其他外鍵被刪除,我說得對嗎? –

相關問題