2011-02-13 29 views
2

當我們在EFv4 EDM圖中有兩個實體並且在數據庫中只有一個表(例如具有表Documents和實體發票和Qoute)時,表Documents具有documentTypeId列作爲鑑別器,並將此列設置爲EDM中的鑑別器(在表映射中),我們如何在代碼中讀取此屬性的值?訪問用於將實體映射到EFv4中的表中的屬性

我們不能給它賦值,因爲EF在底層爲我們做了它(基於我們在條件的表映射中輸入的內容),但不知何故我不明白爲什麼我們也不允許閱讀它。

+0

您不允許將該列添加爲EDM圖中的屬性嗎? – StriplingWarrior 2011-02-13 16:16:22

+0

不,它會導致一個衆所周知的錯誤「條件成員」XY「,並且映射爲」IsNull = False「以外的條件。請刪除XY上的條件或將其從映射中移除。 – mare 2011-02-13 16:26:17

回答

0

您可能想要使用單表繼承層次結構,如here所述。

這樣,您可以獲得包含DocumentTypeId列的摘要Document類。 Invoice s和Quote將擴展此類,但指定某些DocumentTypeId過濾器。但是,由於原始類有一個DocumentTypeId列,它們也都有該列。

另一個優點這種方法是,你可以創建實用的方法,可以在任何Document行動,你可以通過任何InvoiceQuote這些方法。

+0

這是我現在擁有的。問題是,您不能將屬性映射的一部分作爲實體的實體屬性。編譯時錯誤的結果.. – mare 2011-02-13 16:28:19

2

Imo此屬性已被映射,因此您不能再映射它。它用於確定物化實體的類型。你爲什麼需要這樣的專欄。通常它是足夠使用is運營商,如:

var document = context.Documents.GetById(id); 
    if (document is Invoice) 
    { 
    ... 
    } 

如果你只需要選擇亞型可以使用OfType擴展方法,如:

var invoices = context.Documents.OfType<Invoice>().ToList(); 

你也不需要設置時,該值添加新實體,因爲您正在添加子類型 - 發票或報價。

編輯:

當我從您的評論理解你不需要在查詢這些信息。在這種情況下,你不需要映射它。只需使用實體的部分類並添加將返回字符串的自定義屬性。聽起來像愚蠢的解決方案,但實際上它會是最簡單的解決方案。

Discriminator列應該是映射元數據的一部分,所以在T4模板生成實體的情況下,可以更新模板以便爲您生成此類屬性。

相關問題