《Entity Framework 6 Recipes》中文翻译系列 (39) ------ 第七章 使用对象服务之配置模型和使用单复数服务
翻译的初衷以及为什么选择《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) ------ 第七章 使用对象服务之配置模型和使用单复数服务的更多相关文章
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...
- 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7 标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5 从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数 ...
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍
Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...
- 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型
不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- 《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模
2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-4使用实体SQL查询模型 问题 你想通过执行Entity SQL语句来查询你的实 ...
随机推荐
- form表单提交问题
1.提交后不能跳转到指定页面 jsp代码 <form class="form-horizontal" role="form"> <p clas ...
- 改变按钮在iPhone下的默认风格
-webkit-appearance: none; "来改变按钮在iPhone下的默认风格,其实我们可以反过来思路,使用"appearance"属性,来改变任何元素的浏览 ...
- 【Centos】修改网卡名字&随之出现的问题
自从学了工具tcpdump之后,里面会需要涉及到针对某个网卡抓包,因而会输入网卡名字,可是centOS7蛋疼的网卡默认命名实在是让人心碎,所以就想到了要修改网卡名字,步骤如下:(以下步骤涉及到我的错误 ...
- Spring Cloud 统一配置
http://blog.csdn.net/catoop/article/details/50955949
- iOS APP可执行文件的组成
iOS APP编译后,除了一些资源文件,剩下的就是一个可执行文件,有时候项目大了,引入的库多了,可执行文件很大,想知道这个可执行文件的构成是怎样,里面的内容都是些什么,哪些库占用空间较高,可以用以下方 ...
- java MD5 32位加密
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 ...
- java 判断两个list是否相等
/** * 队列比较 * @param <T> * @param a * @param b * @return */ public static <T extends Compara ...
- Codeforces 624
B. Making a String time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 2016-1-28 图解HTTP(03)
6.2.5 非HTTP/1.1首部字段 不限于RFC2616中定义的47种首部字段,还有Cookie.Set-Cookie和Content-Disposition等在其他RFC中首部字段 ...
- UE4 AI BehaviorTree 各个节点执行顺序总结
一个游戏DEMO的AI部分 用到行为树组件如上 主要说一下这两个组件 一个装饰(类似过滤器) 一个服务(代码逻辑与Blackboard交互) Service分为 大碰撞 和 小碰撞 两个碰撞范围, 大 ...