2013-03-22 31 views
0

說我有一個我想要刪除的用戶,但用戶可能會被數據庫中的其他表引用。有沒有辦法在嘗試刪除之前檢查對此用戶的引用,或者是刪除並捕獲/處理SaveChanges()引發的異常的最佳選擇?實體框架在刪除之前檢查參考

很顯然,我可以檢查每個表,其中用戶可能被引用...但我寧願不像它在幾個地方被引用,它似乎是一個混亂的方式來做事情。

回答

2

我現在不是現在如果你已經找到了解決方案,但我發佈,因爲我自己遇到類似的問題。我想你可以使用查詢來檢查引用讓這樣說..

bool related = db.Article.Where(i => i.CategoryId == id).Any(); 

但我相信這是更好地捕捉到了異常,而不是檢查引用。

對於您想所需的關係,但沒有級聯刪除您 可以明確地覆蓋該公約和配置級聯刪除與 流利的API行爲的情況。 要使用的Fluent API方法被稱爲WillCascadeOnDelete並將布爾值作爲參數 。這種配置適用於某種關係,這意味着您首先需要使用具有/ With配對的指定關係,然後調用WillCascadeOn 刪除。喜歡的東西:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Article>() 
      .HasRequired(a => a.Category) 
      .WithMany(i => i.Articles) 
      .WillCascadeOnDelete(false); 
     base.OnModelCreating(modelBuilder); 
    } 

那麼你通常取決於您的數據是如何加載到內存中得到DbUpdateException或InvalidOperationException異常。您可以用簡單的語句來捕捉它們,並向用戶添加消息。

try 
{ 
    db.Category.Remove(category); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 
catch (DataException) 
{ 
ModelState.AddModelError("", "Your message here"); 
return View(category); 
} 

什麼WillCascadeOnDelete基本上做的是,它改變你的數據庫從級聯無操作這會導致錯誤發生違規時要拋出的可刪除規則。 這裏的總體信息是,您可以控制級聯刪除設置,但您將負責避免或解決由於 不存在級聯刪除而可能導致的衝突。它爲我工作,希望它也可以幫助你。 另見:Configuring Relationships with the Fluent API

+0

很好的解釋,謝謝。我最終採用了「錯誤捕捉」解決方案,因爲它似乎是處理事情的最好方式。 – Trent 2013-04-08 03:19:40