前一段时间园子里有很多文章介绍分析了Linq To SQL,它可以说是一个简单实现的ORM,是微软针对数据和对象的阻抗不平衡的问题。C# 3.0推出一些新的特性,比如Extension Method, Lambda Expression, Anonymous Type,其实这些新特性都是用来为Linq服务。Linq To SQL将程序员从以往写大量的sql查询语句、取值、赋值中解放出来,在intellisense和编译上做了很多工作,使得这些查询能够在编译期进行检查。同时微软推出ADO.NET Entity Framework,即下一代的ADO.NET。它是比Linq To SQL更加强大的ORM,让开发人员只需要着眼于领域对象模型的开发,而不需要考虑它们是如何与关系数据库交互。

本文由一个简单的例子进行介绍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。

现在我们就可以进行查询了,先引用命名空间:

using System.Data.Objects;
using NorthwindModel;
 首先我们查询所有的Customer,代码和Linq To SQL中的十分相似。
 using (NorthwindEntities ctx = new NorthwindEntities()){foreach (var customer in ctx.Customers){Console.WriteLine(customer.CustomerID);}}

接着来查询某个Customer,

 Customer alfki = ctx.Customers.Where("it.CustomerID = 'ALFKI'").First();

"it.CustomerID = 'ALFKI'"表示查询条件语句,该语句看着又像C#代码又像SQL,被成为Entity SQL Language,具体语法在帮助文档上有很详细的Reference。

这里也可以使用Linq进行查询(Linq To Entities),需要引用System.Linq命名空间,似乎Entity Framework不支持Single方法,会抛出异常。

 Customer alfki = ctx.Customers.First<Customer>(it => it.CustomerID == "ALFKI");
或者
 Customer alfki = (from c in ctx.Customerswhere c.CustomerID == "ALFKIA"
                  select c).First();
在Entity Framework中进行一对多的查询很简单,但是值得注意的是Entity Framework默认是Lazy Load,即关联数据在需要的时候才加载。
在本例子中,如果直接查询该Customer关联的orders,查询不到结果。
 foreach (var order in alfki.Orders){Console.WriteLine(order.OrderID);}

需要在使用orders之前调用 alfki.Orders.Load(), 再次运行便可以得到正确的结果。
//================================================================================
ADO.NET Entity Framework,即下一代的ADO.NET。它是比Linq To SQL更加强大的ORM,让开发人员只需要着眼于领域对象模型的开发,而不需要考虑它们是如何与关系数据库交互。上一篇文章简单介绍了在项目中如何使用ADO.NET实体框架,从现在开始,正式进入了ADO.NET的学习之旅。这篇文章主要介绍在ADO.NET实体框架中如何进行查询(以Northwind数据库为例)。

1. 使用EntityCommand进行查询

在实体框架中,我们可以通过EntityCommand进行查询,它的使用方法就像ADO.NET中的SqlCommand。不同的是SqlCommand使用标准SQL语句对数据库进行查询,而EntityCommand使用Entity SQL对EntityContainer进行查询,当然最终实体框架会将Entity SQL转换成标准SQL语句查询数据库。

  EntityConnection con = new EntityConnection("Name=NorthwindEntities");con.Open();using (EntityCommand cmd = new EntityCommand("select value c from NorthwindEntities.Customers as c", con)){EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);while (reader.Read()){Console.WriteLine("ID [{0}], ContactTitle [{1}]", reader["CustomerID"], reader["ContactTitle"]);}}

首先是建立一个EntityConnection,它接受一个参数,表明使用的是在config文件中的哪个连接字符串。

<connectionStrings>
   <add name="NorthwindEntities" connectionString="metadata=.\Northwind.csdl|.\Northwind.ssdl|.\Northwind.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\sqlexpress;Initial Catalog=Northwind;Integrated Security=True&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

可以看到这个连接字符串和以往ADO.NET中使用的连接字符串并不一样。metadata:指明.csdl/.ssdl/.msl三个文件的路径,这三个文件的作用以后再做说明。provider:表示使用的是SqlClient或者Oledb或者Odbc。provider connection string:这一项便是以往所用的连接字符串。providerName表示现在用的是EntityClient。

接着构造EntityCommand,最后通过EntityDataReader进行数据的读取,值得注意的是这里的EntityCommand接受的是Entity SQL语句,而不是标准SQL语句,具体的Entity SQL语法可以参考帮助文档。

2. 使用ObjectQuery进行查询

实体框架提供一个名为ObjectQuery的类,它让开发人员通过Entity SQL进行查询,查询结果以对象的形式供使用。

 using (NorthwindEntities ctx = new NorthwindEntities()){ObjectQuery<Customer> query= ctx.CreateQuery<Customer>("NorthwindEntities.Customers");ObjectResult<Customer> result = query.Execute(MergeOption.NoTracking);foreach (Customer c in result){Console.WriteLine("ID [{0}], ContactTitle [{1}]",c.CustomerID, c.ContactTitle);}}

首先调用CreateQuery方法来创建ObjectQuery对象(当然这里也可以使用new,只是传进的参数不同而已),它接受Entity SQL语句作为参数。然后调用Execute方法进行查询,它接受MergeOption枚举型的参数,表示解决冲突的方法。查询结果以对象的形式(这里是Customer)保存在ObjectResult中。

下面是使用new的写法:

 using (NorthwindEntities ctx = new NorthwindEntities()){ObjectQuery<Customer> query = new ObjectQuery<Customer>("Customers", ctx);foreach (Customer c in query){Console.WriteLine("ID [{0}], ContactTitle [{1}]",c.CustomerID, c.ContactTitle);}}

3. ADO.NET Entity Framework Tool自动生成Entities和各个对象的代码,帮助开发人员减少了很多体力活。这样,我们可以简单写成:

 using (NorthwindEntities ctx = new NorthwindEntities()){foreach (Customer c in ctx.Customers){Console.WriteLine("ID [{0}], ContactTitle [{1}]",c.CustomerID, c.ContactTitle);}}

其实这里,也是使用ObjectQuery来进行查询。当然,可以给查询加上更多的条件,在上一篇文章中也有说明这里就不写了。

值得关注的是:自动生成的实体类中有这样一个方法,比如Customer:

 public static Customer CreateCustomer(string customerID, string companyName){Customer customer = new Customer();customer.CustomerID = customerID;customer.CompanyName = companyName;return customer;}

并不像以前一样,提供带参数的构造函数,而是提供CreateCustomer的静态方法来构造Customer实例。这似乎和前一段时候贫血充血的问题有关了,实体对象该不该有行为,是贫血还是充血?虽然只是一个方法,不过相信这也表明了微软的态度吧。

转载于:https://www.cnblogs.com/RobotTech/archive/2007/11/26/972811.html

ADO.NET Entity Framework 学习相关推荐

  1. ADO.NET Entity Framework 学习(1) [ZT]

    前一段时间园子里有很多文章介绍分析了Linq To SQL,它可以说是一个简单实现的ORM,是微软针对数据和对象的阻抗不平衡的问题.C# 3.0推出一些新的特性,比如Extension Method, ...

  2. ADO.NET Entity Framework 学习(1)

    前一段时间园子里有很多文章介绍分析了Linq To SQL,它可以说是一个简单实现的ORM,是微软针对数据和对象的阻抗不平衡的问题.C# 3.0推出一些新的特性,比如Extension Method, ...

  3. ADO.NET Entity Framework学习笔记(2)建模[转]

    模型结构 [概念模型]中要有[实体键], [实体键]要与表中的 [主键] 对应,也就是说表必须要有主键. 表中的[唯一键]不会在[概念模型]中体现 在[概念模型]中默认是不允许修改[实体键]的值的 联 ...

  4. ADO.NET Entity Framework学习笔记(4)ObjectQuery对象

    ObjectQuery<T>数据加载方式 1. ObjectQuery<T> 提供了一个管理[实体对像]集合 2. ObjectQuery<T>继承System.D ...

  5. EF架构~了解一下,ADO.NET Entity Framework

    回到目录 以下文章部分来自百度百科 背景 长久以来,程序设计师和数据库总是保持着一种微妙的关系,在商用应用程序中,数据库一定是不可或缺的元件,这让程序设计师一定要为了连接与访问数据库而去 学习 SQL ...

  6. Entity Framework (EF)/Linq To entity/ ESQL(entity sql)区别 ADO.NET Entity Framework:来自微软官方的ORM框架

    长久以来,程序员和数据库总是保持着一种微妙的关系,在商用应用程序中,数据库一定是不可或缺的元件,这让程序员一定要为了连接与访问数据库而去学习 SQL 指令,至少对于我而言,我觉得这是一个很不爽的事情. ...

  7. 软件开发知识--[ADO.NET Entity Framework]

    ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Vi ...

  8. Entity Framework 学习

    Entity Framework 学习初级篇1--EF基本概况... 2 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateE ...

  9. EF(ADO.NET Entity Framework)

    对象/关系映射框架 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.该框架曾经为.NET Framew ...

最新文章

  1. 模拟实现请求分页虚存页面替换算法_模拟卷二解答
  2. My blog please navigate to http://hi.baidu.com/248828412
  3. spring cloud-zuul的Filter详解
  4. 02NSString 转换 UTF8
  5. VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)
  6. 【Python】解决浮点数间运算存在不确定尾数的问题
  7. MASM32使用教程
  8. input标签中使输入文本向右偏移像素解决方案(亲测有效)
  9. Tomcat 配置https证书
  10. 菜鸟系列之C/C++经典试题(七)
  11. js获取内网ip_WebRTC安全问题:私有IP与mDNS
  12. jQuery插件实现表格隔行换色且感应鼠标高亮行变色
  13. cadence 介绍
  14. 网吧游戏更新对比软件技术报告
  15. 灵活无成本的ITSM系统|ServiceHot ITSOM
  16. 远程控制 - 手机完全控制电脑之TeamViewer
  17. SpreadJS 纯前端表格控件应用案例:金融业数据智能分析平台
  18. 基于时延法的麦克风阵列声源定位分析
  19. debian usb android,Debian下挂载usb设备
  20. Leetcode.463 岛屿的周长

热门文章

  1. Disabling Shortcut Keys in Full Screen mode
  2. 数据操作类:增删改查
  3. 带“公交一卡通功能”的智能手环会是用户最爱?
  4. Prism4翻译笔记(四)第四章:模块化应用程序开发
  5. 一首最接近完美的天籁之音+莎拉布莱曼《斯卡布罗集市》+
  6. Web后端学习笔记 Flask(9)cookie and session
  7. Java核心类笔记(字符串方法、StringBuilder(Joiner)、包装、JavaBean、枚举、Math、随机数)
  8. Win10如何删除3D对象文件夹
  9. 框架下载_最新安卓XDA框架插件下载仓库
  10. python怎么创建类的例题_Python_面向对象练习题