2011-04-20 114 views
1

我有Customers表:Customer(id,name status_id)。
我有狀態表:狀態(id,名稱,代碼)。
客戶與狀態之間有關係(FK):status_id(客戶)= id(狀態)。枚舉與實體框架 - 枚舉值獨立於錶行ID

在我狀態枚舉和客戶類中的.NET代碼:

enum Status { 
    status_1, 
    status_2, 
    status_3, 
    status_4 
} 

class Customer { 
    public virtual long id {get;set;} 
    public virtual string name {get;set;} 
    public virtual Status customer_status {get;set;} 
} 

的枚舉沒有從該數據庫的狀態行的值,因爲我不希望創建的依賴代碼中的數據(硬編碼)。

如何使用實體框架以在edmx中顯示客戶類?

編輯:
所有我找到了解決方案假定枚舉值都相同,客戶表中的STATUS_ID。他們甚至沒有對我非常重要的狀態表,這是爲了限制status_id的值的可能性。

回答

4

沒辦法。枚舉根本不被支持,所以你必須改變你的類來包含statusId(不一定是公共的),而不是映射的customer_status,它將處理數據庫記錄到枚舉的轉換。您必須將依賴關係包含到recrod中,因爲您的代碼必須知道哪個記錄Id代表哪個枚舉成員。這不是結構映射,而是數據映射,當然這包括數據依賴性。

還不包括狀態表到您的模型。

有一個approach to fake enums in EFv4但它需要更改您的代碼,並且枚舉成員可能必須使用與數據庫記錄相同的值。

+0

@Ladislav Mrnka:非常appriciate幫助我。我不明白你的建議。實際上,存儲在數據庫中的值對代碼是透明的 - 代碼不應該關心值,而是代表狀態表中代碼的字符串。我想到了將字符串值轉換爲枚舉類型的視圖(與您的示例鏈接相同,但不是使用int - 使用字符串),但我不知道如何處理它。 – Naor 2011-04-20 20:30:58

+0

@Naor:這更加複雜 - 你想要將值從導航屬性映射到枚舉。所以你必須將Statuses表添加到模型中。每次加載客戶時都必須加載它,並且必須再次定義單獨的非映射屬性,這會將相關實體轉換爲枚舉。並且請注意,非映射屬性不能用於linq-to-entities查詢。 – 2011-04-20 20:34:11

+0

@Ladislav Mrnka:我能做什麼?哪些「依賴價值」的可能性我有?我有我的表中的數據。改變我的代碼中的所有枚舉是很多工作。 – Naor 2011-04-20 20:45:14