翻译的初衷以及为什么选择《Entity Framework 6 Recipes》来学习,请看本系列开篇

7-3  配置模型

问题

  你想了解配置模型中的各种选项。

解决方案

  当你添加一个ADO.NET实体数据模型到你的项目中时,实体框架设置.edmx文件的Build Acion属性为Entity Deploy。另外,设置元数据项目处理(Metadate Artifact Processing)为“嵌入输出程序集中”(Embed in Output Assembly)。当你编译项目时,Entity Deploy 会从.edmx文件中提取三个部分的内容放到三个不同的文件中。CSDL部分被提取到Model.csdl文件,MSL部分被提取到Model.msl文件中,SSDL部分被提取到Model.ssdl文件中。因为“嵌入输出程序集中"选项,这三个文件会作为资源嵌入到程序集中。

  更改元数据项目处理(Metadate Artifact Processing)为“复制到输出目录”(Copy to Output Directory),会导致model.*这三个文件被复制到程序集的输出目录中。它们不会作为资源被嵌入到程序集中。

原理

  .edmx文件包含全部三层:概念模型层,映射层和存储逻辑层。 它还包含设计器用于管理计设窗口的数据。在运行时,实体框架单独使用每一层。.edmx文件只是一个供设计时使用的便捷容器。模型的配置依赖模型中所有的层,这些层可以被嵌入程序集,存储在文件中,也可以是7-2节中看到的那样,从别的数据源获取并完成MetadataWorkspace实例的创建。

  如果元数据项目处理(Metadate Artifact Processing)设置为“嵌入输出程序集中”(Embed in Output Assembly),你将会看到你的配置文件App.config或者web.config中的连接字符串,包含一个metadata标签,它可能是如下的样子:

metadata=res://*/Recipe3.csdl|res://*/Recipe3.ssdl|res://*/Recipe3.msl;

  这些符号表示,嵌入程序集中的模型层对应的搜索路径。如果更改元数据项目处理(Metadate Artifact Processing)为“复制到输出目录”(Copy to Output Directory),你会看到连接字符串会改变成类似下面的样子:

metadata=.\Recipe3.csdl|.\Recipe3.ssdl|.\Recipe3.msl;

  这些符号表示,每个模型层对应文件的路径。

  当把模型层定义数据作为资源嵌入程序集中时,你不会被只引用可执行程序集的连接字符串语法所限制。表7-1展示了,你可能在别的程序集中引用嵌入模型层数据的结构。

表7-1. 加载模型层数据的连接字符串语法

7-4  部署模型

问题

  当你从数据库导入模型时,你想使用实体框架的单复数服务。

解决方案

  假设你有如图7-3所示数据库表。

图7-3 数据库的表Employees和Tasks

  注意图7-3中的表使用复数形式。这是很多数据库的常见用法。有些DBA认为,所有的表都应该使用复杂形式;另一些则反对这种作法。还有少数DBA,似乎不使用上面的任何一种做法,而是混合使用。依据你的观点,你也许对模型实体对应的表名使用单数形式。实体框架提供的复数服务,会自动地将实体名从单数形式生成适当的复数形式。

  为了在导入表时使用单复数服务,需要在实体数据模型向导的最后一步(如图7-4),勾选上确定所生成对象名称的单复数形式。默认情况下,这个复选框是勾选上的。

图7-4. 启用复数服务

  图7-5展示的是,在导入图7-3中的表创建模型时,没有使用单复数服务。注意,实体名直接使用了表名,并保持了复数形式。图7-6展示的是导入相同的表建模时,启用单复数服务后,实体名使用的是表名的单数形式。

图7-5. 导入图7-3中的表创建模型时,没有使用单复数服务

图7-6. 导入图7-3中的表创建模型时,启用单复数服务

原理

  很多开发人员喜欢使用图7-6中所展示的实体名形式,(请看实体上边黑体字名称)。他们不光是使用单数形式的实体名,就连Task实体中的导航属性也不是使用图7-5中所展示的那种复数形式。在这两种情况下,导航属性是一个实体引用,不是一个集合。图7-5中的复数形式,容易造成混淆。

  如果我们的表名是单数形式,单复数服务会正确地复数化基于集合的导航属性和实体集的名称。 这是为了照顾另一半使用单数形式表名的DBA社区。

  你可以通过修改“以复数形式表示新对象”属性,来设置添加新实体到模型时,单复数服务的默认状态为on/off(开启/关闭)。

  你可以在实体框架之外使用这个单复数服务,它在System.Data.Entity.Design命名空间中,使用时需要引用System.Data.Entity.Design.dll,你还要将你项目的框架从.NET Framwork4 Client Profile修改成.NET Framwork4(译注:如果已经是该框架,就不用修改了)。这个修改操作在项目的属性里。代码清单7-3,演示了单复数服务对单词“Person"和"People"的单复数化。

代码清单7-3. 使用单复数服务

             var service = PluralizationService.CreateService(new CultureInfo("en-US"));
string person = "Person";
string people = "People";
Console.WriteLine("The plural of {0} is {1}", person,
service.Pluralize(person));
Console.WriteLine("The singular of {0} is {1}", people,
service.Singularize(people));

代码清单7-3的输出如下:

The plural of Person is People
The singular of People is Person

实体框架交流QQ群:  458326058,欢迎有兴趣的朋友加入一起交流

谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/VolcanoCloud/

《Entity Framework 6 Recipes》中文翻译系列 (39) ------ 第七章 使用对象服务之配置模型和使用单复数服务的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7  标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5  从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数 ...

  4. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  5. 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍

    Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...

  6. 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型

    不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...

  7. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  8. 《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模

    2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到 ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-4使用实体SQL查询模型 问题 你想通过执行Entity SQL语句来查询你的实 ...

随机推荐

  1. 【Hibernate框架】三种继承映射

    一.综述 大家都知道,hibernate作为ORM框架的一个具体实现,最大的一个优点就是是我们的开发更加的能体现出"面向对象"的思想.在面向对象开发中,类与类之间是可以相互继承的( ...

  2. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    有时候,当我们使用"mysql"."mysqladmin"."mysqldump"等命令管理数据库时,服务器抛出类似如下错误: 一.错误现场 ...

  3. 快速上手seajs——简单易用Seajs

    快速上手seajs——简单易用Seajs   原文  http://www.cnblogs.com/xjchenhao/p/4021775.html 主题 SeaJS 简易手册 http://yslo ...

  4. UVALive 2453 Wall (凸包)

    题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...

  5. [转]在Eclipse中使用JUnit4进行单元测试(初级篇)

    首先,我们来一个傻瓜式速成教程,不要问为什么,Follow Me,先来体验一下单元测试的快感! 首先新建一个项目叫JUnit_Test,我们编写一个Calculator类,这是一个能够简单实现加减乘除 ...

  6. 安卓智能POS终端手持机PDA应用仓库出入库,移库,盘点,销售开单系统

    随着移动互联网的兴起,目前仓储管理所面临的的问题可以迎刃而解,WMS仓库系统解决方案通过智能终端扫描条码技术应用解决了工作量大导致工作效率不高,以及数据实时传输等问题,该方案主要提供仓库出入库,移库, ...

  7. 深入理解Java的接口和抽象类(转)

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  8. C#对象序列化与反序列化zz

      C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...

  9. 【BFS】HDU 1495

    直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...

  10. jmobile学习之路 ---- 视口

    当我们的浏览器在窗口最大化的时候,此时屏幕的宽度,就是我们桌面的分辨率.这个规则仅仅适用于PC! 我们试图在iPhone中输出屏幕宽度,你会发现屏幕宽度是980!居然和PC屏幕差不多大! 苹果主导的这 ...