你的代碼示例是非常錯誤的,因爲它使你的實體依賴於上下文(而且你不處理的話)。整個POCO方法只是爲了避免這種情況(POCO T4生成器和DbContext T4生成器)。
如果您與數據庫中的查找表有關係,EF將爲您提供導航屬性。如果數據庫中沒有這種關係,並且您正在使用EDMX文件,則仍然可以在模型中創建這種關係,並且您將再次獲得導航屬性以查找表。一旦你有導航屬性,你可以簡單地做:
string code = myEntity.State.Code;
但導航屬性必須被加載或者通過預先加載(如@BrokenGlass所述)或延遲加載。
如果您不喜歡導航屬性的想法,並且您仍然希望State
屬性只顯示狀態代碼,則必須瞭解它的含義:如果您將實體映射爲只讀狀態,則它將爲只讀狀態EF將無法將複合實體轉換回必須更新的實際表。可以按照你想要的方式映射實體,但是它被認爲是高級的(並且大部分是不需要的)場景,它只在你有EDMX文件(不是用代碼優先的方法)時才起作用。選項包括:
- 創建數據庫視圖和視圖映射到一個新的實體
- 在EDMX手動創建DefiningQuery(開闢爲XML)文件,並將其映射到一個新的實體(一旦你做,你不能更新從數據庫模型或生成模型數據庫更多)
- 在EDMX手動創建QueryView(開闢爲XML)文件,並將其映射到一個新的實體(這需要將已經映射原始實體)
你將不得不爲每張桌子做這件事你想要這樣的映射。反正全是用手工更改不需要EDMX,因爲你可以簡單地創建,如自定義類的複雜性:
public class SomeViewModel // I suppose your main target is to have codes in presentation layer
{
public string SomeData { get; set; }
public string State { get; set; }
}
,並使用投影查詢
如果您有導航屬性:
var data = from x in context.SomeEntities
select new SomeViewModel
{
SomeData = x.SomeData,
State = x.State.Code
};
如果您沒有導航屬性
var data = from x in context.SomeEntities
join y in context.LookupValues on x.LookupId equals y.Id
select new SomeViewModel
{
SomeData = x.SomeData,
State = y.Code
};
謝謝。我想我已經意識到,儘管許多表(通常是來自表格的許多列)具有這種關係,但它仍然存在於模型中的關係。 「從數據庫嚮導創建模型並沒有體現所有這些關係,但我想我只是將它們添加到模型中,我很欣賞這些建議。 –