2011-07-08 35 views
0

我有一個使用自定義模型記錄查詢值(即狀態,類型等)的數據庫。因此,在所有的數據庫表中,有很多列稱爲state_cdv_id,它們將存儲整數並引用code_value表以獲取該狀態的值(即「CA」,「AK」等)。在生成的EF模型中訪問通用代碼值表

我想映射我的EF模型,以便我可以訪問所有這些字段的代碼值,並且我不想在部分類中爲每個實體手動執行操作...這是很多的重複。所以我希望能夠訪問我的代碼值,例如:MyPerson.State並獲取字符串「CA」。

下面是一個吸氣將是我將不得不重複很多次,如果我是做手工:

public string State 
    { 
     get 
     { 
      MyEntityContext c = new MyEntityContext(); 
      return c.CodeValues.Single(cv => cv.Id == RecordStatusCdvId).Value; 
     } 
    } 

我不知道最好的辦法是什麼:改變T4模板,將屬性屬性添加到某些字段,然後以編程方式向這些或其他內容添加獲取。

任何幫助?

回答

1

如果有一個1:實體和code_value表1之間關係的實體應該已經有一個State屬性,它在默認情況下,這將是默認爲空,然後你可以通過使用Include填補它在你的DB查詢:

var foo = context.MyEntities.Include(x => x.State); 
+0

謝謝。我想我已經意識到,儘管許多表(通常是來自表格的許多列)具有這種關係,但它仍然存在於模型中的關係。 「從數據庫嚮導創建模型並沒有體現所有這些關係,但我想我只是將它們添加到模型中,我很欣賞這些建議。 –

1

你的代碼示例是非常錯誤的,因爲它使你的實體依賴於上下文(而且你不處理的話)。整個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 
       };