2012-01-12 16 views
0

我有這兩個相關的表客戶端(ClientId,Name)和ClientDescription(ClientDescriptionId,(FK)ClientId,說明)。也就是說每個客戶可以有很多關聯的描述。現在,當顯示ClientDescription列表時,我也需要知道它的關聯客戶端的名稱是什麼。如何使我的clr實體非規範化,但保持我的db表正常化?

現在你可能會說我已經擁有這些信息,因爲我可以簡單地按照我的導航屬性返回關聯的客戶端並使用其名稱。我不能這樣做,因爲我在Ria服務中自動生成一個網格,這只是給我一個導航屬性的計數,而我還沒有找到一種方法在我的元數據文件中將其平坦化。因此,我爲什麼要一個財產。

整個想法是,我希望能夠添加一個新的字段到我的數據庫,從數據庫更新我的實體類,並重新生成我的域服務,新的字段應該彈出在我的網格中。我不應該因爲我的數據庫碰巧有一個額外的字段而更新我的xaml。因此,我想要做的是將一個ClientName字段添加到實體(clr對象),但保持我的數據庫清潔(在db中沒有這樣的非規範化)。

因此,我生成了我的edmx,並添加了一個名爲ClientName的新屬性。將其設置爲StoreGeneratedPattern.Computed並編譯。然後我得到一個令人討厭的小錯誤

Error 3004: Problem in mapping fragments starting at line NN: No mapping specified for properties (etc..) 

解決方案顯然是從我的EDMX生成我的數據庫。 (或者這就是關於這個錯誤的問題的答案似乎會產生。)但是,這會產生一個我不想要的實際DB領域,所以這個答案不適用於我的案例。

所以我的問題是:我如何反規範我的clr實體,但保持我的db表正常化?

編輯:我想這個問題可以推廣一下。如果ClientDescription包含一些我想要進行計算的數字字段,並且我希望將結果用作字段,並且該算法應該在c#中而不是在我的數據庫中,問題將會相同。

回答

2

要回答你的更廣義的問題:

實體是由實體框架生成具有partial關鍵字。 這意味着實體的代碼可以在同一個命名空間和程序集的多個源文件中拆分。一個將包含來自實體框架的生成代碼,另一個將包含自定義屬性和方法。

例如,如果,你的實體有數據庫字段PriceAmount你可以在局部類TotalPrice這將返回Price * Amount添加屬性。

然後該算法將是C#和您的數據庫將不知道額外的屬性。