2015-06-09 86 views
0

我的代碼,第一個實體框架模型如下:多級聯通道實體框架

在我的數據庫我有customerspurchasesitems

  • customer可具有若干purchases
  • 每個purchase可以由幾個purchased_item
  • 每個purchased_item參考了一個item

所以,用FluentAPI配置我的實體時,我有以下配置:

public class PurchaseConfiguration : EntityTypeConfiguration<Purchase> 
{ 
    public PurchaseConfiguration (string schema = "dbo") 
    { 
     ToTable(schema + ".Purchase"); 
     HasKey(p => p.PurchaseId); 
     Property(p => p.Name); 

     HasMany(p => p.PurchasedItems) //This is an ICollection of PurchaseItem in the Purchase class 
      .WithRequired(pi => pi.Purchase) 
      .HasForeignKey(pi => pi.PurchaseId) 
      .WillCascadeOnDelete(true); 
    } 
} 

public class ItemConfiguration : EntityTypeConfiguration<Item> 
{ 
    public ItemConfiguration (string schema = "dbo") 
    { 
     ToTable(schema + ".Item"); 
     HasKey(i => i.ItemId); 
     Property(i => i.Name); 

     HasMany(i => i.PurchasedItems) 
      .WithRequired(pi => pi.Item) 
      .HasForeignKey(pi => pi.ItemId) 
      .WillCascadeOnDelete(true); 
    } 
} 

public class PurchasedItemConfiguration : EntityTypeConfiguration<PurchasedItem> 
{ 
    public PurchasedItemConfiguration (string schema = "dbo") 
    { 
     ToTable(schema + ".PurchasedItem"); 
     HasKey(rp => rp.PurchasedItemId); 
    } 
} 

我怎麼想這個表現是,當你在DB擦除purchased item沒有涉及到任何一個信息purchaseitem丟失。但是,如果從db中刪除itempurchase,則purchaseditem也會被刪除。

然而,當我嘗試更新我的數據庫,我得到以下異常:

表「PurchasedItem」引進國外KEY約束「FK_dbo.PurchasedItem_dbo.Item_ItemId」可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。
無法創建約束或索引。查看以前的錯誤。

+0

應該工作...你有三個表之間的任何其他關係? – jjj

+0

不,我不知道。唯一的另一種關係是將具有級聯刪除的'customer'設置爲true,這樣當用戶被刪除時,他的所有購買和物品都將被刪除。 –

回答

1

你得到一個週期,因爲一個Customer有許多Purchase S和許多Item S,而且每個實體都有級聯路徑PurchasedItem。如果客戶有很多PurchasedItem而不是Item - 那是什麼意思? - 這也會創造一個循環。

級聯方向:

  +----------+  
      | Customer |  
      +--+----+--+  
      | |   
      | |   
+--------+ | | +----+ 
|Purchase| <-+ +-> |Item| 
+----+---+   +--+-+ 
    |     | 
    |     | 
    | +-------------+ | 
    +> |PurchasedItem| <+ 
     +-------------+  
+0

您的圖表精確地顯示了我的實體之間的關係。爲什麼這是個問題?我希望CASCADE刪除從Customer到PurchasedItem。這可能嗎? –

+0

對於許多具有級聯操作的數據庫而言,您無法爲任何表指定多個路徑(請參見[this](https://technet.microsoft.com/zh-cn/library/ms186973%28v=sql) .105%29.aspx)。您可能必須使用觸發器或手動處理它,例如,刪除'Customer'和'Item'之間的級聯刪除,並且在刪除'Customer'之前,刪除它的'Item's第一。 – jjj