2011-03-19 45 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