2011-03-19 54 views
5

使用實體框架的一個經常寫這樣的查詢爲實體框架自動生成的表名

var orders = from o in context.Orders.Include("Customer") 
      where o.OrderDate.HasValue && o.OrderDate.Value.Year == 1997 
      orderby o.Freight 
      select o; 

什麼是真正讓我的胃翻騰的是"Customer"字符串參數。我很難相信EF不會在任何地方生成表名作爲常量。有誰知道比使用字符串更好的方法嗎?爲Include提取選項?

回答

6

EF 4.1已經強類型的包括IQueryable的,和的ObjectQuery可用的DBQuery版本。一旦你添加參考EntityFramework.dll(EF 4.1),您可以添加使用System.Data.Entity的,並使用預先加載與lambda表達式

// get Orders with related Customers 
var orders = from o in context.Orders.Include(o => o.Customer) ... 

編輯:

如果你不想使用EF 4.1檢查this article。我已經在我的項目中使用過,我很滿意。

+0

酷,但我需要它4.0 – 2011-03-20 09:41:01

+0

4.1只是圖書館。您仍然可以使用4.0並鏈接庫來獲取該功能。 – 2011-03-20 10:01:29

1

IMO的GetType可以幫助你比所有的定義存儲.edmx文件等,

context.Orders.Include(CustomerEntity.GetType.Name or full name) 
+1

不,這是錯誤的,因爲導航屬性名稱可以更改。 – 2011-03-19 16:43:43

+0

它不會有任何問題,因爲edmx映射照顧它。 – paragy 2011-03-19 16:46:49

+1

不,如果導航屬性的類型是「客戶」,我可以將EDMX中的導航屬性中的名稱更改爲「FirstCustomer」,但是在使用.Include(「Customer」)的任何地方都不會重命名,問題是與refractoring。 – 2011-03-19 16:49:40

1

如何

Include(context.Customers.EntitySet.Name) 

+1

不幸的是,因爲客戶是在模型中定義的實體集合,但「Include」期望實體中定義的屬性的名稱。名稱可以與實體集不同。 – 2011-03-19 21:20:07

1

您可以創建一個文本模板,除了EF的默認代碼以外,還可以生成代碼。您可以通過右鍵單擊並單擊「添加代碼生成項目」來完成此操作。

在這個文本模板中,您可以根據需要在「CustomerProperties」中創建常量,併爲每個導航屬性創建常量名稱。

http://msdn.microsoft.com/en-us/data/gg558520

+0

聽起來很有趣。我還沒有玩過.tt,請你詳細說明要插入什麼? – 2011-03-20 09:40:41

+1

請檢查我的編輯... – 2011-03-20 09:55:17