Entity Framework 自动生成的表名

5

使用Entity Framework时,常常编写如下查询:

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提取选项的方法?

4个回答

6

EF 4.1拥有针对IQueryable、ObjectQuery和DbQuery可用的强类型Include版本。一旦您添加了对EntityFramework.dll(EF 4.1)的引用,您可以添加using System.Data.Entity并使用lambda表达式进行贪婪加载。

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

编辑:

如果您不想使用EF 4.1,请查看这篇文章。我已经在我的项目中使用过了,感觉很好。


4.1只是一个库,你仍然可以使用4.0并链接该库以获取该功能。 - Ladislav Mrnka

1

在编程方面,IMO GetType 可能会对你有所帮助,除了 .edmx 文件,其中存储了所有的定义。

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

1
不对,因为导航属性名称可以更改。 - Akash Kava
不会有任何问题,因为edmx映射会处理它。 - indiPy
1
不,如果导航属性的类型是“Customer”,我可以在EDMX中更改导航属性的名称为“FirstCustomer”,但是这样做,无论在哪里使用.Include(“Customer”),都不会被重命名,问题出现在重构方面。 - Akash Kava
我猜他关闭了使用导航属性的功能。 - indiPy

1

怎么样?

Include(context.Customers.EntitySet.Name)

?


1
很遗憾,无法这样做,因为Customers是模型中定义的实体集,但Include期望实体中定义的属性名称。该名称可能与实体集不同。 - Ladislav Mrnka

1

您可以创建一个文本模板,以便生成除EF默认代码之外的代码。您可以右键单击并单击“添加代码生成项”来执行此操作。

在此文本模板中,您可以根据需要创建常量并为每个导航属性创建常量名称。

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


听起来很有趣。我还没有尝试过.tt,你能详细说明一下应该插入什么吗? - Carlo V. Dango

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接