日期:2014-05-20  浏览次数:20984 次

Entity Framework 学习初级篇--EF基本概况

自从Entity Framework(EF)第一版本的发布以来,我们陆续从用户那里得到了许多高质量的反馈。根据这些反馈,在.NET 4中,我们为Entity Framework添加了许多新的功能和改进,下面我们就来一窥Entity Framework 4中的新特性。

?

外键支持(Foreign Keys)

?

Entity Framework添加了对外键的支持。利用外键关联,您现在可以将外键属性包含在实体里,这样做可以简化诸如数据绑定、n-tier开发等关键方案的开发。您可以直接使用外键属性设置实体之间的关系:

?

?

?

??? using (BlogEntities ctx = new BlogEntities()) {

?

??????? Post myPost = new Post {

?

??????????? PostID = 102,

?

??????????? PostName = "Post Title",

?

??????????? CreatedDate = DateTime.Now,

?

??????????? PostContent = "Post Content",

?

??????????? BlogID = 11

?

??????? };

?

??????? ctx.Posts.AddObject(myPost);

?

??????? ctx.SaveChanges();

?

??? }

?

?

?

?

在这个例子里,即使BlogID == 11的这个Blog对象从未被装载,我们也可以直接把新建的myPost对象与这个Blog对象之间的关系通过外键关联起来。

?

延迟加载支持(Lazy Loading)

?

现在Entity Framework支持延迟加载。一个新的模型在VS2010中被创建的同时,提供延迟加载功能的实体也被生成出来。默认情况下这个功能是开启的,一个查 询操作返回的实体对象并不会被马上加载,而是会在实际被使用的时候加载。举例来说,延迟加载意味着下面这个代码段里,每个Post对象会在实际被调用来打 印PostName属性的时候被加载。

?

?

?

?

?

??? using (var ctx = new BlogEntities()) {?
??????? foreach (var b in ctx.Blogs) {?
??????????? Console.WriteLine(b.BlogName);?
??????????? //请注意我们并未主动装载当前blog的posts?
??????????? //EF会为我们延迟加载?
??????????? foreach (var p in b.Posts)?
??????????????? Console.WriteLine(p.PostName);?
??????? }?
??? }

?

简单传统CLR对象(Plain Old CLR Object)支持

?

?

EF4为实体提供了简单传统CLR对象(Plain Old CLR Object / POCO)支持。您的实体对象可以独立于EF存在,由此EF更好地支持了测试驱动开发(test-driven development)和领域驱动设计(domain-driven design)。同时,EF仍旧可以帮助跟踪POCO实体的变化,允许延迟加载,也会自动修正对导航属性(navigation properties)和外键的改动。您可以在ADO.NET的博客 上找到更多关于POCO支持的信息。

?

?

?

文本模板转换工具集(Text Template Transformation Toolkit)代码生成

?

?

在Entity Framework的初始版本中,您无法随心所欲地配置EF的代码生成,而且代码生成的配置也没有集成到Visual Studio中。新版本的Entity Framework利用文本模板转换工具集(Text Template Transformation Toolkit / T4)不但简化了代码生成的个性化配置,也使得用户对代码生成有更加灵活和强大的控制。Visual Studio集成了这一功能,您可以在Entity Framework设计器的空白处右击,选择“Add Code Generation Item…”。随后您可以获得内置的代码生成模板。

?

?

?

?

?

?

?

?

当然,您并不局限于这个随着VS2010一起发布的默认代码生成策略,您现在可以编写自己的 T4 模板 或者修改默认模板,使之生成您想要的代码。

?

?

?

更好的N层设计(N-Tier)支持

?

?

我们经常需要分离数据层、业务逻辑层、交互层,来确保数据的完整性并提高每层的可维护性。这时候我们要用到N-Tier设计。Entity Framework小组收到了一些改进N-Tier支持的要求,他们采纳了这一建议,增强了API以支持N-Tier设计。除此之外,EF小组实现了一个 代码生成模板,能够生成内置N-Tier特性(如更改追踪)的对象。这个模板生成的实体,本质上是一系列的CLR类,它们带有Windows Communication Foundation(WCF)序列化属性,因此它们可以与WCF服务一同使用。

?

?

?

改进SQL语句的生成

?

我们持续不断地努力改进生成的SQL语句的可读性和性能。在EF4中,针对使用Entity Framework进行的查询,在生成SQL语句的部分我们作出了大量的简化和改进。其中之一是我们去掉了一些多余的join语句。另一个改进是对于 WHERE语句的字符串参数使用数据库的通配符。例如下面的LINQ查询语句会被翻译成一个使用WHERE子句和LIKE语句,并使用‘%’通配符在所有 的Blogs里搜索BlogName属性以‘Visual Studio’开头的Blog。

?

??? var query = from b in ctx.Blogs?
??????????????? where b.BlogName.StartsWith("Visual Studio")?
??????????????? select b;???

?

?

?

这些改动看起来好像很小,但改进的SQL生成能够使得查询执行得更快,减轻SQL Servers和网络的负载。

?

?

?

增强对存储过程(Stored Procedure)的支持

?

许多数据库都利用存储过程来执行自定义的SQL过程。Entity Framework允许您在实体模型中创建一个函数,从中调用一个存储过程。您只需要通过函数导入(Function Import)功能就可以将存储过程导入为一个函数。在新版本中,函数导入功能可以检测到存储过程返回的数据列,并为这些列创建一个复杂类型。当然,当存 储过程定义改变后,已有的复杂类型也可以被更新。下面这个截屏显示的是Entity Framework设计器的存储过程向导,引导您一步步将存储过程导入为函数:

?

?

?

?

Entity Framework 4提供的这些新特性,目的是提高程序员的工作效率。您可以在项目论坛 上与团队分享您的想法和意见,在Entity Framework团队博客 及设计博客 上与他们联系,也请关注Channel 9上的视频和screencasts 。

?

最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品。不过,据说在.Net4.0中,微软将推荐使用此框 架,并会有所改善。而且,现在基本上所有数据库均提供了对EF的支持。因此,为以后做技术准备可以学习研究以下。但是,我个人觉得就目前来说,在实际项目 慎用此框架。

下面简单的介绍以下这个EF。

在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品。用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储架构编程)来创建数 据访问应用程序。目标是降低面向数据的应用程序所需的代码量并减轻维护工作。Entity Framework 应用程序有以下优点:

  • 应用程序可以通过更加以应用程序为中心的概念性模型(包括具有继承性、复杂成员和关系的类型)来工作。
  • 应用程序不再对特定的数据引擎或存储架构具有硬编码依赖性。
  • 可以在不更改应用程序代码的情况下更改概念性模型与特定于存储的架构之间的映射。
  • 开发人员可以使用可映射到各种存储架构(可能在不同的数据库管理系统中实现)的一致的应用程序对象模型。
  • 多个概念性模型可以映射到同一个存储架构。
  • 语言集成查询支持可为查询提供针对概念性模型的编译时语法验证。

实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。在EF中的实体数据模型(EDM)由以下三种模型和具有相应文件扩展名的映射文件进行定义。

  • 概念架构定义语言文件 (.csdl) -- 定义概念模型。
  • 存储架构定义语言文件 (.ssdl) -- 定义存储模型(又称逻辑模型)。
  • 映射规范语言文件 (.msl) -- 定义存储模型与概念模型之间的映射。

实体框架 使用这些基于 XML 的模型和映射文件将对概念模型中的实体和关系的创建、读取、更新和删除操作转换为数据源中的等效操作。EDM 甚至支持将概念模型中的实体映射到数据源中的存储过程。它提供以下方式用于查询 EDM 并返回对象:

  • LINQ to Entities -- 提供语言集成查询 (LINQ) 支持用于查询在概念模型中定义的实体类型。
  • Entity SQL -- 与存储无关的 SQL 方言,直接使用概念模型中的实体并支持诸如继承和关系等 EDM 功能。
  • 查询生成器方法 --可以使用 LINQ 风格的查询方法构造 Entity SQL 查询。

下图演示用于访问数据的实体框架体系结构:

?

下面,来学习EF的基本使用方法。软件环境::

  • Visual Studio 2008 +SP1
  • SQL Server2005/2008

首先,建立一个名为“EFProject”的解决方案,然后添加一个名为“EFModel”的类库项目。如下图所示。

?

?

接着,在EFModel项目中,添加“ADO.NET Entity Data Model”项目,如下图所示:

?

?

名称取为“NorthWindEF.edmx”,然后点击“添加”。然后,在后面的步骤中,数据库选择“NorthWind”后,在选择影射对象是,把表、试图、存储过程全部都选上,其他的均保存默认的即可。最终生成的结果如下图所示。

?

?

?

好了,数据模型生成完毕。

最后,谈谈我认为的一些缺点:

  • Edmx包含了所有对象的csdl,ssdl,msl文件,过于庞大,如果要手动修改这个文件,一不小心,眼睛看花了,就改错了。(和数据集一样的毛病)。
  • 目前EF支持表、试图、存储过程,其他的对象不支持,而且对使用存储过程有很多限制(目前有EFExtension提供了更多对象的支持)。
  • 除了MS SQL Server可直接提供这种可视化的设计界面外,其他的数据库目前还没有提供可视化设计界面(但可以自己来实现,后面介绍)。
  • 性能问题。(网上看到有说比ADO.Net慢700百,又有人说比ADO.net快的,具体情况我还没测试过, 但我觉得像这个些类型的框架,性能肯定是比上原生态的ADO.net慢)

好了,接下来,学习以下简单的各种操作。