翻译的初衷以及为什么选择《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. NPM 使用淘宝镜像

    --registry https://registry.npm.taobao.org

  2. VS自定义项目模板:[2]创建VSIX项目模板扩展

    VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...

  3. C#ListBox对Item进行重绘,包括颜色

    别的不多说了,上代码,直接看 首先设置这行,或者属性窗口设置,这样才可以启动手动绘制,参数有三个 Normal: 自动绘制 OwnerDrawFixed:手动绘制,但间距相同 OwnerDrawVar ...

  4. css3实现圆形逐渐减少动画

    写这个动画刚开始完全没有思路,后来参考网上的资料发现可以用半圆实现,具体原理如下: 1.,一个div作为背景,三个div做出三个半圆出来,一个用于旋转,一个靠左(用于与背景吻合),一个靠右(用于与背景 ...

  5. iOS 键盘遮挡输入 解决办法

    .初始化及添加通知观察者 - (void)viewDidLoad { [super viewDidLoad]; self.tableView = [[UITableView alloc] initWi ...

  6. hack

    1.Firefox @-moz-document url-prefix() { .selector { property: value; } }上面是仅仅被Firefox浏览器识别的写法,具体如: @ ...

  7. 洛谷 P1182 数列分段Section II Label:贪心

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  8. SVN出现Invalid authz configuration解决方案

    思路: 1.检查是否为不存在的用户组或用户设置了权限(大部分为此问题,调整用户权限或删除账号后,但忘了去掉某个文件夹的权限) 2.检查authz文件的编码: 3.更改权限后是否未重启svn. 4.按照 ...

  9. 对Java数组中去除重复项程序分析

    我作为一个Java菜鸟,只会用简单的办法来处理这个问题.如果有大神看到,请略过,感激不尽! 所以首先先分析这道题目:数组中重复的数据进行删除,并且要让数组里的数据按原来的顺序排列,中间不能留空. 既然 ...

  10. PHP 通过百度API 实现通过城市名称获取经度

    $city = $_GET['city'];print_r(getjw($city));/*** $city 需要查询的地址* $key 百度开发者账号*/function getjw($city){ ...