翻译的初衷以及为什么选择《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. 国外程序员整理的Java资源大全分享

    Java 几乎是许多程序员们的入门语言,并且也是世界上非常流行的编程语言.国外程序员 Andreas Kull 在其 Github 上整理了非常优秀的 Java 开发资源,推荐给大家. 译文由 Imp ...

  2. orm映射 封装baseDao

    是用orm映射封装自己封装dao层 思路:通过映射获得实体类的属性拼接sql语句 import java.lang.reflect.Field; import java.lang.reflect.In ...

  3. 《转》Unity3D研究院编辑器之5.3JSON的序列化

    Unity5.3 的一项新功能就是Json的序列化,支持嵌套使用,可以把json字符串转成对象,把对象转成json字符串. using UnityEngine; using UnityEditor; ...

  4. 记录同事的一个bug-ajax-413错误-fullhead

    症状表现为在form下面的textarea里的字符数只有几十个的时候,请求可以成功,但是如果有几百字,则会出现413错误,提示fullhead,我第一反应是cookie体积太小,但是清了缓存还是一样的 ...

  5. topcoder SRM 628 DIV2 BishopMove

    题目比较简单. 注意看测试用例2,给的提示 Please note that this is the largest possible return value: whenever there is ...

  6. 初步了解CPU

    了解CPU By JackKing_defier 首先说明一下,本文内容主要是简单说明CPU的大致原理,所需要的前提知识我会提出,但是由于篇幅我不会再详细讲解需要的其他基础知识.默认学过工科基础课. ...

  7. CSS常用布局学习笔记

    水平居中-行内元素 如果是文字和图片这类的行内元素,则在其父级元素上加上样式:text-align:center; 水平居中-定宽块元素 div{ width:100px; margin:0 auto ...

  8. mac 终端 常用命令

    基本命令1.列出文件ls 参数 目录名        例: 看看驱动目录下有什么:ls /System/Library/Extensions参数 -w 显示中文,-l 详细信息, -a 包括隐藏文件2 ...

  9. css单位:em,rem解释

    em:所有浏览器都符合:1em=16px;1.具有继承性2.em的根元素是body,当设置了根元素的大小时,大小是定义的数字乘以根元素定义的大小值 rem:1rem=16pxrem不具有继承性,其根元 ...

  10. 如何使用其他文件中定义的类Python

    我在文件a.py中定义了一个类class A(object),现在想在b.py中的类B中某个函数中创建一个A的对象,需要如何操作呢? 我在b的头加了import a.py然后使用语句 obj = A( ...