zoukankan      html  css  js  c++  java
  • 《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. 使用单复数服务

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

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

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

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

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

  • 相关阅读:
    第一堂课20210302
    第一堂课20210301
    第一堂课20210301
    实验2-3-1 求1到100的和 (10分)
    实验2-3-2 求N分之一序列前N项和 (15分)
    实验2-3-3 求奇数分之一序列前N项和 (15分)
    实验2-3-4 求简单交错序列前N项和 (15分)
    实验2-3-5 输出华氏-摄氏温度转换表 (15分)
    实验2-3-6 求交错序列前N项和 (15分)
    实验2-3-7 求平方与倒数序列的部分和 (15分)
  • 原文地址:https://www.cnblogs.com/VolcanoCloud/p/4542013.html
Copyright © 2011-2022 走看看