1

我們有一個系統,允許管理員在系統內創建新的內容類型,包括與其他表的外鍵鏈接。然後,管理員可以重建數據庫,然後創建表格和所有必要的關係,然後重新構建EDMX並重新編譯所有內容。像冠軍一樣工作(我沒有寫,或者我可能知道這個答案)。實體框架 - 反向外鍵檢查

我們有的一個缺點是,當用戶去刪除可能被另一個表中的項目鏈接的記錄時。由於參照完整性,這會引發錯誤。當然,我陷入了這種情況,但我現在可以提供的是一個通用的'你不能刪除這個項目,因爲它鏈接到某種類型的錯誤。我寧願檢查該項目是否可刪除,如果不是,則禁用該按鈕。

有沒有一種方法可以在運行時確定將要刪除的項目鏈接到哪個表/行?通常,我只是查詢相關表格,但由於這個應用程序的性質,我不知道那些其他表格在設計時會是什麼。

因此,在短期,如果我有:

富:FooID,FooName 酒吧:BarID,FooID,BarName 數值:PowID,FooID,PowName

是否有可能在運行時告訴一個由於來自Bar或Pow的FK連接,Foo中的行不能被刪除,如果可以,我可以告訴哪個表導致錯誤?

在此先感謝;首先在這裏發帖,所以請原諒任何禮節漏洞:)。

回答

2

,必須查詢的元數據,並得到所有的導航性能

ObjectSet = context.CreateObjectSet<YourEntityType>(); 

// Get entity set for current entity type 
var entitySet = ObjectSet.EntitySet; 
// Get name of the entity's navigation properties 
_propertyNames = ((EntityType)entitySet.ElementType).NavigationProperties.Select(p => p.Name).ToArray(); 

的名單現在你有哪些必須刪除之前檢查的屬性。要檢查屬性,您必須加載這些成員,並且您必須檢查相關實體是否存在。兩者都可能需要很多反射,這會影響應用程序的性能。我不得不說,你的應用程序架構是可怕的。這就像一個例子:應該在哪裏使用EF或者EF如何使用。

+0

特別是從我非常粗略的描述和製作的表格中,你會說這個('可怕'部分)? – Chris 2011-05-12 09:56:11

+0

是的,我在這裏和那裏遇到拉迪斯拉夫的答案,他們通常質量很高,但我對這個「可怕的建築」部分感到驚訝。 @拉迪斯拉夫:你能否就此擴大一點,因爲這不明顯,你的意思是? – 2011-05-12 10:39:00

+1

@zespri,@Chris:如果您使用EF來定義模型,您可以定義數據庫並編寫使用模型的代碼,測試應用程序並部署它。模型的任何更改都由開發人員決定,該開發人員必須確保應用程序仍然有效,並且沒有任何用例被更改中斷。很顯然,在問題中描述的方法Admin可以觸發一些自動的真棒功能,它修改模型,重新生成類,重建程序集並重新部署應用程序違反了這個很難。我甚至不明白你爲什麼這樣做,你怎麼能使用未知功能? – 2011-05-12 10:44:28