当前位置: 首页 > news >正文

Entity Framework In Action--5 Domain model mapping(2)

5.2.3 Describing the database in the storage schema

  在OrderIT例子的EDMX文件里,存储模型在edmx:Edmx/edmx:Runtime/edmx:StorageModels路径下。

  但是如果你想手动创建文件,你可以为他起名OrderIT.ssdl,并在链接字符串引用他。

  Schema

  Schema是存储模型的根元素。他比概念模型中的Schema多了两个属性。

  Provider-----指定ADO.NET提供程序

  ProviderMainfestToken-----指定数据库版本号(SQL Server 2000,2005,2008).

  下面是Scmema元素的一个例子:  

<Schema 
  Namespace="OrderITModel.Store"
  Alias
="Self"   Provider="System.Data.SqlClient"
  ProviderManifestToken
="2008"   xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/"   xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"> ... </Schema>

  EntityContainer

  EntityContainer声明了之后要描述的文件里的所有数据库对象。他只有一个表示container名称的属性Name。设计器给他复制是他的命名空间加上后缀

(suffix)StoreContainer。在存储模型里只有一个EntityContainer元素,因为对象属于单一的数据库。在EntityContainer里,你可以为每个表或视图创建一个EntitySet元素。

相对于在概念模型里,EntitySet在存储模型中有更多的属性:

  Name--指定对象的逻辑名称。设计器使用表的名称,但是这不是强制性的(mandatory)。

  EntityType--代表对象的FQN(fully qualified name),使用{namespace}.{name}格式。

  Schema--表示表的拥有者。

  Table--表的实体名称。Table不是必须添加的,当他被省略(omitted)的时候,Name被使用。

  store:Type--确定对象时表还是视图。

  下面是代码片段:  

<EntityContainer Name="OrderITModelStoreContainer">
  <EntitySet Name="Order" EntityType="OrderITModel.Store.Order" store:Type="Tables" Schema="dbo" />
  <EntitySet Name="OrderDetail" EntityType="OrderITModel.Store.OrderDetail" store:Type="Tables" Schema="dbo" />
</EntityContainer>

  EntityType

  用EntityType元素描述对象,就像(much as)在概念模型文件一样。你必须为放在EntityContainer里的每个EntitySet元素创建一个元素。在概念文件里,classes是继承层

次结构(inheritance hierarchy)的一部分,他有一个EntitySet和很多的EntityType。数据库本身(natively)不支持继承,所以在存储文件里,不可能有一个实体集对应许多表或视

图。每个EntityType节点有一个Name属性,他的值必须匹配entity container里的EntitySet的Name属性。

  Property与在CSDL里的副本有相同的属性,加上一些其他的来满足数据库的需要:

  Collation--Specifies the collation of the column

  DefaultValue--指定列的默认值

  Unicode--指定值是不是字符编码

  代码片段:

<EntityType Name="Order">
  <Key>
    <PropertyRef Name="OrderId" />
  </Key>
  <Property Name="OrderId" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
  <Property Name="ShippingAddress" Type="nvarchar" Nullable="false" MaxLength="50" />
  <Property Name="ShippingCity" Type="nvarchar" Nullable="false" MaxLength="50" />
  <Property Name="ShippingZipCode" Type="nvarchar" Nullable="false" MaxLength="15" />
  <Property Name="ShippingCountry" Type="nvarchar" Nullable="false" MaxLength="30" />
  <Property Name="EstimatedShippingDate" Type="datetime" Nullable="false"/>
  <Property Name="ActualShippingDate" Type="datetime" Nullable="false" />
  <Property Name="CustomerId" Type="int" Nullable="false" />
</EntityType>
<EntityType Name="OrderDetail">
  <Key>
    <PropertyRef Name="OrderDetailId" />
  </Key>
  <Property Name="OrderDetailId" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
  <Property Name="Quantity" Type="smallint" Nullable="false" />
  <Property Name="UnitPrice" Type="decimal" Nullable="false" Precision="29" Scale="29" />
  <Property Name="Discount" Type="decimal" Nullable="false" Precision="29" Scale="29" />
  <Property Name="OrderId" Type="int" Nullable="false" />
  <Property Name="ProductId" Type="int" Nullable="false" />
</EntityType>

  存储模型也完成了,现在你只需要将概念模型和存储模型链接起来。

5.2.4 Creating the mapping file

  在OrderIT例子的EDMX文件里,edmx:Edmx/edmx:Runtime/edmx:Mappings是映射部分的路径。如果你想创建自己的文件,你可以创建OrderIT.msl然后在链接字符串

里指定他。

  

  Mapping and EntityContainerMapping

  Mapping节点的声明是固定的。StorageEntityContainer属性用来指定存储模型容器,CdmEntityContainer属性用于概念模型,看代码:  

<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
  <EntityContainerMapping CdmEntityContainer="OrderITEntities" StorageEntityContainer="OrderITModelStoreContainer">
...
</EntityContainerMapping>
</Mapping>

 

  在实体容器被链接后,下一步是将表和视图映射到类。这个用在EntityContainerMapping元素内的EntitySetMapping元素来完成。

  EntitySetMapping, EntityTypeMapping, and MappingFragment

  EntitySetMapping节点让你去声明哪个实体集是你要映射的(记住,在一个实体集内你可以有多个类)。他只有一个属性Name,用来指定实体集名字。

  在EntitySetMapping里面,你为每个实体添加一个EntityTypeMapping元素。通过TypeName属性设定实体类型,设定的必须格式为IsTypeOf(EntityName),EntityName

是实体的完全名称。

   现在我们来映射表。因为一个类个可以映射到一个活多个表(Order映射到Order表,但是Shirt映射到Product和Shirt表),在EntityTypeMapping元素里你可以为每个涉及的

表指定一个MappingFragment元素。他只有StoreEntitySet属性,他必须匹配在存储模型里的实体集的Name属性。代码:  

<EntitySetMapping Name="Orders">
  <EntityTypeMapping TypeName="IsTypeOf(OrderITModel.Order)">
    <MappingFragment StoreEntitySet="Order">
    ...
    </MappingFragment>
  </EntityTypeMapping>
</EntitySetMapping>

<EntitySetMapping Name="OrderDetails">   <EntityTypeMapping TypeName="IsTypeOf(OrderITModel.OrderDetail)">     <MappingFragment StoreEntitySet="OrderDetail">     ...     </MappingFragment>   </EntityTypeMapping> </EntitySetMapping>

  ScalarProperty and ComplexProperty

  ScalarProperty 两个属性:

    Name--代表属性名。

    ColumnName--代表被映射的列。  

  ComplexProperty 两个属性:

    Name--指定类里的属性名称。

    TypeName--包含复杂类型的完全名称。

  ComplexProperty 本身是没有用的。你要将他的属性映射到列,这可以用嵌套ScalarProperty元素来完成。

    注意:因为复杂类型可以嵌套(nested),你可以将一个ComplexProperty放到另一个ComplexProperty里。

  代码:  

<EntitySetMapping Name="Orders">
  <EntityTypeMapping TypeName="IsTypeOf(OrderITModel.Order)">
    <MappingFragment StoreEntitySet="Order">
      <ScalarProperty Name="Id" ColumnName="Id" />
      <ComplexProperty Name="ShippingAddress" TypeName="OrderITModel.AddressInfo">
        <ScalarProperty Name="Address" ColumnName="ShippingAddress" />
        <ScalarProperty Name="City" ColumnName="ShippingCity" />
        <ScalarProperty Name="ZipCode" ColumnName="ShippingZipCode" />
        <ScalarProperty Name="Country" ColumnName="ShippingCountry" />
      </ComplexProperty>
      <ScalarProperty Name="EstimatedShippingDate" ColumnName="EstimatedShippingDate" />
      <ScalarProperty Name="ActualShippingDate" ColumnName="ActualShippingDate" />
    </MappingFragment>
  </EntityTypeMapping>
</EntitySetMapping>

<EntitySetMapping Name="OrderDetails">   <EntityTypeMapping TypeName="IsTypeOf(OrderITModel.OrderDetail)">     <MappingFragment StoreEntitySet="OrderDetail">       <ScalarProperty Name="Id" ColumnName="Id" />       <ScalarProperty Name="Quantity" ColumnName="Quantity" />       <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />       <ScalarProperty Name="Discount" ColumnName="Discount" />     </MappingFragment>   </EntityTypeMapping> </EntitySetMapping>

  

 

转载于:https://www.cnblogs.com/feiDD/articles/3197656.html

相关文章:

  • 在IDEA中编译Maven项目
  • Python绘制数码管显示当前时间
  • ECSHOP 购物车数量更新时自动更新价格 不要重新点击更新数量按钮
  • 关于ansible远程执行的环境变量问题(login shell nonlogin shelll)
  • Effective C++ 学习笔记[1]
  • Spring Boot 2.0 with Spring 5 Kotlin support and Spring WebFlux functional
  • mysql表分区案例
  • C# :WinForm TextBox猜想输入和历史记录输入
  • 并发服务器:Redis案例研究分析
  • POJ 3041 Asteroids (最小点覆盖集)
  • 不通过调用__Init__来创建实例
  • 算法学习--动手
  • 10-padding(内边距)
  • linux中grep和egrep的用法
  • hashlib模块学习:hmac
  • .pyc 想到的一些问题
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Android单元测试 - 几个重要问题
  • Android交互
  • CSS实用技巧
  • Java知识点总结(JavaIO-打印流)
  • Laravel Telescope:优雅的应用调试工具
  • MySQL QA
  • MySQL用户中的%到底包不包括localhost?
  • Octave 入门
  • Python学习之路13-记分
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于组件的设计工作流与界面抽象
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端
  • 如何用vue打造一个移动端音乐播放器
  • 深入浅出Node.js
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • #git 撤消对文件的更改
  • #QT(一种朴素的计算器实现方法)
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)ORM
  • **PHP二维数组遍历时同时赋值
  • 、写入Shellcode到注册表上线
  • .NET DataGridView数据绑定说明
  • .Net IOC框架入门之一 Unity
  • .net 流——流的类型体系简单介绍
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .Net中ListT 泛型转成DataTable、DataSet
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @Builder用法
  • @JoinTable会自动删除关联表的数据
  • @SuppressWarnings(unchecked)代码的作用
  • [Android 数据通信] android cmwap接入点