2011-09-27 59 views
0

我有一個對象Tag,它鏈接到一大堆其他對象。我正在嘗試處理此對象的刪除。我只是不想刪除標籤,如果它與任何其他對象相關聯。在ASP .NET中刪除之前檢查引用完整性違例MVC

目前我解決這樣的:

if(tag.Stands.Count == 0 && tag.Skids.Count == 0 
    && tag.Panels.Count == 0 && tag.Devices.Count == 0 
    && tag.Cables.Count == 0 && tag.JunctionBoxes.Count == 0) 
{ 
    _db.Tags.DeleteObject(tag); 
    _db.SaveChanges(); 
} 

如果我沒有檢查所有的這些事情,我明明得到一個參考約束錯誤,例如

System.Data.SqlClient.SqlException:DELETE語句衝突 與基準約束 「FKStandTag237968」。

我知道解決這個問題的方法是使用級聯刪除,但它是實際的業務邏輯,如果標記與任何其他對象關聯,則不應刪除標記。

有沒有一種方法使用實體框架,我可以檢查我不會破壞數據庫上的任何約束,然後再嘗試保存刪除?東西沿着_db.IsValidToDelete(object)

+0

這是您需要在數據庫級別處理的錯誤,因此您必須創建一個新的上下文來處理它。 –

+0

我建議看UnitOfWork,看這裏http://lavinski.tumblr.com/post/9114111237/object-relational-mapper-exceptions –

回答

2

擁有這樣的方法(_db.IsValidToDelete(object))並不能保證您可以安全地刪除。您的應用程序是一個多用戶應用程序。因此,一個用戶可能會在另一個用戶嘗試刪除該標籤時關聯標籤。

所以更好的選擇是允許用戶刪除標籤並捕獲異常來檢查它是否是參照完整性違規。

+0

我明白你的觀點。然而,拋出的異常是一個包含'SqlException'的'UpdateException'。我很擔心,如果我捕捉到一個廣泛的例外,比如我可能會掩蓋其他錯誤的那些。這是一個有效的擔心? – link664

+0

@ link664捕捉和吞嚥異常是兩回事。你檢查異常,看看你是否可以處理它,否則拋出它。 – Eranga

2

Btw。像tag.Stands.Count這樣的每個調用都會將所有相關的Stands從數據庫加載到您的應用程序中,所以如果您有很多關係並且每個都包含很多實體,則此驗證將會非常昂貴和緩慢。

您可以使用@ Eranga的建議並捕獲異常或創建存儲過程以刪除標記。

+0

+1有關實體加載的評論,沒有想到這一點。 – link664

相關問題