[Programming Entity Framework] 第2章 探究实体数据模型(EDM)(三)

Programming Entity Framework 第二版翻译索引

SSDL:存储模式

继续我们那简单的模型,现在该来看一下另一块,在讨论MSL之前需要理解的SSDL。

EDMX文件中StorageModels模块是它所关联的数据存储的图示。这个文件的元素与CSDL文件非常相似。图2-17展示了来自于EDMX文件中完整的SSDL,尽管不是每个片段都是展开的。

注:EDM设计工具包括了一些允许你从数据库更新模型的特性。在EDM设计器中,它可以通过右键的上下文菜单中获得。在第7章中你将与这些特性工作,把数据库的存储过程引入到模型中。

为了一致性,表和列被称为EntityType和属性。你将经常看到在文档中它被以表和列的名称提及,甚至在可视化工具中。

注意SSDL在下列方面与CSDL有所不同:

  • 模式元素:
    • 命令空间后面加上了".Store",清楚地表明这个模式是用于数据存储,而不是模型的概念层。
    • 它有一个叫做ProviderManifestToken的属性。救命中的值表示SQL Server版本的简单表达,例如,2008,它是该模型使用的数据库。SQL Server2008真实的版本号是10.0.1600.22。EF依赖这个信息,所以它是必需的。这些值由你使用的提供程序(在这个示例中,SqlClient)和它为令牌对外暴露的值决定。
    • Xmlns命令空间表明此XML文件该模块使用的命名空间。再次强调,这个特定的参数是静态的。
  • 实体容器
    • 实体容器的名称是"SampleModelStoreContainer",它来自于数据库名称。
  • 实体类型
    • 实体类型名称是数据库中表的真实名称。
    • 属性类型是数据存储数据类型,在本例中,是SQL Server数据类型。
    • 标识列是StoreGeneratedPattern="Identity"属性,意思是值在行数据插入时会被创建(例如,由数据库创建)且不能改变。另一个选项是"Computed",它表示值在插入和更新时被生成,选项"None"是默认值。

在第16章中,你将有机会直接与SSDL元数据打交道。你可以在附录C中找到更多关于SSDL元数据的额外详细说明。

注:注意在ProviderManifestToken中指定的数据库版本。如果你正打算从SQL Server的一个版本移到到另一个(例如,你的开发机器使用SQL Server2008,但是客户使用的是SQL Server2005),你将需要手工在XML文件中修改此值。

 

MSL:映射

EDMX文件最后一个模块是Mappings模块。在EF元数据中,映射层在概念层和存储层中间,它不仅提供了从实体属性映射回数据存储的数据库的表和列中,还使得我们可以对模型进行更深入的自定义。

你可以在设计器的映射详细窗口中查看映射。跟着来操作,关闭模型的XML视图,在解决方案浏览器中通过双击模型的EDMX文件在设计器中打开模型。

为了看到映射详细窗口,在Contact实体上右键,从菜单中选择表映射。Contact的映射信息将在映射详细窗口中显示,参见图2-18。

图2-18直观地展示了Contact实体如何映射到存储层中的Contact表。这是由"映射到Contact"定义的,它指定了SSDL中表的名称。换句话说,Contact实体映射到Contact表。因为Contact实体没有被自定义过,映射很简单,在概念层和存储层之间是一对一的映射。

在Contact表的表选项下面,你可以看到来自表的列(左边)都被映射到实体的属性(右边)上了。当你他自己创建这些映射,而不是依靠向导时,默认情况下,设计器将名称一一匹配,这非常有帮助。

你看到列包含提供程序的类型(来自SQL Server的int, nchar和datatime),而属性包含EF的基本类型(Int32, String和DataTime)。

你可以使用"添加一个条件"和"添加一个表或视图"占位符来更深入的自定义模型。我们将在第14章覆盖这个主题。

附录C浏览了表示这个模型映射的XML。

第19章会介绍更多关于关联和映射的内容。

EDM中的数据库视图

EDM中我们还未提到的是来自救命数据库的数据库视图。向导将视图导入模型,生成了vOfficeAddress实体。EF处理数据库视图的方式与处理表的方式一样。

如果你浏览了模型,你会发现SSDL中有一个称为DefiningQuery的东西,它包括来自数据库定义视图的T-SQL。

注:当你最开始使用EDM向导创建模型时,你可能在错误列表窗口中看到关于这个视图的一些警告信息。向导将发现视图没有主键,并会在这个实体中推断一个非null的属性值作为实体主键。这些警告信息告诉你这些,同样在EDMX会嵌入相同的消息。

注:向导不能合建没有EntityKey的实体。因此,如果在视图中没有非null的值,或者在表中,因为这个缘故,它将完全跳过对该对象的实体创建

第16章将深入讨论DefiningQuery。而现在,记住视图作为实体进入模型,如果视图是不可更新的,你可以尝试着使用存储过程更新它,这个特性被称为function mapping。你将在第7章学习更多关于函数映射的内容。

注:记住对数据库表、视图或者其它对象的任何改变不会自动更新到模型。你将在第7章中学习到关于更新模型的内容。

总结

本章向你介绍了实体数据模型和设计工具的一些功能。你创建了你的第一个EDM,并从内部得了对它常见组件的理解。你在设计器和原生XML文件中浏览了映射。

正如之前解释过的,EDM在你开始利用它的自定义功能时闪闪发光。现在你对于EDM已经有了良好的理解,你已经准备好学习更加高级的映射和自定义了。这些 我们将在第14章到16章中讲到。但是现在,这个模型足够用于查询,这个就是接下来的一章中要开始学习的。

posted @ 2012-10-17 14:22  鱼十七  阅读(1927)  评论(2编辑  收藏  举报