本文由一个简单的例子进行介绍Entity Framework是如何使用的。在此之前,必须下载ADO.NET Entity Framework runtime 和tools,官方也提供了很多示例下载。下面正式开始ADO.NET Entity Framework之旅(开发工具VS 2008 beta,以Northiwind数据库为例)。
首先建立一个Console project(要选择.NET Framework 3.5),然后点击Add New Item,看见ADO.NET Entity Data Model选项:
然后会出现Wizard,选择数据库,选择表、视图、存储过程等,按照向导一步步来就可以了,在这里只选择Customers和Orders表。在Solution Explore视图里面点击Northwind.edmx,可以看到Entity的信息(看上去很像Linq To SQL的dbml设计视图),然后将它们改名为Customer和Order。
现在我们就可以进行查询了,先引用命名空间:
1 2 |
<span style="color:#0000ff">using</span> System.Data.Objects; <span style="color:#0000ff">using</span> NorthwindModel; |
1 |
首先我们查询所有的Customer,代码和Linq To SQL中的十分相似。 |
1 2 3 4 5 6 7 |
<span style="color:#0000ff">using</span> (<span style="color:#2b91af">NorthwindEntities</span> ctx = <span style="color:#0000ff">new</span><span style="color:#2b91af">NorthwindEntities</span>()) { <span style="color:#0000ff">foreach</span> (<span style="color:#0000ff">var</span> customer <span style="color:#0000ff">in</span> ctx.Customers) { <span style="color:#2b91af">Console</span>.WriteLine(customer.CustomerID); } } |
接着来查询某个Customer,
1 |
<span style="color:#2b91af">Customer</span> alfki = ctx.Customers.Where(<span style="color:#a31515">"it.CustomerID = 'ALFKI'"</span>).First(); |
"it.CustomerID = 'ALFKI'"表示查询条件语句,该语句看着又像C#代码又像SQL,被成为Entity SQL Language,具体语法在帮助文档上有很详细的Reference。
这里也可以使用Linq进行查询(Linq To Entities),需要引用System.Linq命名空间,似乎Entity Framework不支持Single方法,会抛出异常。
1 |
<span style="color:#2b91af">Customer</span> alfki = ctx.Customers.First<<span style="color:#2b91af">Customer</span>>(it => it.CustomerID == <span style="color:#a31515">"ALFKI"</span>); |
1 |
或者 |
1 2 |
<span style="color:#2b91af">Customer</span> alfki = (<span style="color:#0000ff">from</span> c <span style="color:#0000ff">in</span> ctx.Customers <span style="color:#0000ff">where</span> c.CustomerID == <span style="color:#a31515">"ALFKIA"</span><span style="color:#0000ff">select</span> c).First(); |
1 |
在Entity Framework中进行一对多的查询很简单,但是值得注意的是Entity Framework默认是Lazy Load,即关联数据在需要的时候才加载。 |
1 |
在本例子中,如果直接查询该Customer关联的orders,查询不到结果。 |
1 2 3 4 |
<span style="color:#0000ff">foreach</span> (<span style="color:#0000ff">var</span> order <span style="color:#0000ff">in</span> alfki.Orders) { <span style="color:#2b91af">Console</span>.WriteLine(order.OrderID); } |