entity framework中的edmx文件作为代码与数据库沟通的桥梁,作用是至关重要的。如果edmx文件出了问题,ef就基本上没得用了。虽然edmx文件是由ef自动生成的,但是一些特定的操作可能会引发ef的bug,从而导致edmx文件出错,并且无法使用“从数据库更新模型”命令来修复,删除edmx重建又要在新的edmx中重新声明大量枚举类型,这个时候,理解ef的内部结构就显得很必要了。

我们创建一个简单的数据库,里面只有一张User表,表中有Id,Name,Type三个字段,其中Id为主键int型,Name为nvarchar型,最大长度为500,Type为int型,实体类中对应为枚举。

创建完毕后,用文本编辑器打开edmx文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
<!-- EF Runtime content -->
<edmx:Runtime>
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="edmxModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2012" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
<EntityType Name="User">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" Nullable="false" />
<Property Name="Name" Type="nvarchar" MaxLength="500" />
<Property Name="Type" Type="int" Nullable="false" />
</EntityType>
<EntityContainer Name="edmxModelStoreContainer">
<EntitySet Name="User" EntityType="Self.User" Schema="dbo" store:Type="Tables" />
</EntityContainer>
</Schema>
  </edmx:StorageModels>
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema Namespace="edmxModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="User">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Int32" Nullable="false" />
<Property Name="Name" Type="String" MaxLength="500" FixedLength="false" Unicode="true" />
<Property Name="Type" Type="Int32" Nullable="false" />
</EntityType>
<EntityContainer Name="edmxEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="User" EntityType="Self.User" />
</EntityContainer>
</Schema>
</edmx:ConceptualModels>
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="edmxModelStoreContainer" CdmEntityContainer="edmxEntities">
<EntitySetMapping Name="User">
<EntityTypeMapping TypeName="edmxModel.User">
<MappingFragment StoreEntitySet="User">
<ScalarProperty Name="Type" ColumnName="Type" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="Id" ColumnName="Id" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
<Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx">
<Connection>
<DesignerInfoPropertySet>
<DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
</DesignerInfoPropertySet>
</Connection>
<Options>
<DesignerInfoPropertySet>
<DesignerProperty Name="ValidateOnBuild" Value="true" />
<DesignerProperty Name="EnablePluralization" Value="false" />
<DesignerProperty Name="IncludeForeignKeysInModel" Value="true" />
<DesignerProperty Name="UseLegacyProvider" Value="false" />
<DesignerProperty Name="CodeGenerationStrategy" Value="无" />
</DesignerInfoPropertySet>
</Options>
<!-- Diagram content (shape and connector positions) -->
<Diagrams></Diagrams>
</Designer>
</edmx:Edmx>

只要认真看一遍,就会发现edmx文件主要分成了三大部分:数据库部分、实体部分、映射部分。

数据库部分为<edmx:StorageModels> (edmx存储模型)标签以内的内容,记录了数据库中各个表的表名、字段以及数据类型。

实体部分为<edmx:ConceptualModels>(edmx概念模型)标签以内的内容,记录了用来承载数据的实体类的相关信息。

映射部分为<edmx:Mappings>以内的内容,记录了每张表与相应的实体类中所有字段与属性的映射关系。如果你尝试在edmx模型视图中修改一个字段并保存,再用文本编辑器打开edmx文件,你就会发现mapping部分中对应的实体属性发生了变化,而数据库部分没有发生改变。利用这个功能可以实现数据库的字段名与实体的属性名不一致但仍能映射,但不推荐这么做,因为你一旦删除edmx重建,你就可能要再起一次别名。

接下来,我们尝试往edmx模型中添加枚举类。做法为edmx模型视图上右键->模型浏览器->枚举类型上添加新的枚举类,最下方勾选引用外部的枚举类型,填上之前定义好的枚举类的命名空间+类名(如 Demo.Model.Type),确认后保存,再用文本编辑器打开edmx文件,就会发现实体部分多出了一条EnumType标签。如:

        <EnumType Name="Type" a:ExternalTypeName="EdmxTest.Enum.Type" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration" />

EnumType标签往往出现在实体部分的末尾,也就是</Schema>标签的上方,利用这一点我们可以很方便的实现Enum记录的备份。

在大型项目多人协同开发的时候,如果某个成员对edmx文件进行了一些不正确的合并操作或者一些可能会引发bug的操作,edmx文件很可能会损坏,调用ef的时候就会报一些莫名其妙的错误。这个时候最简单也是最快捷的方法,就是果断的删除edmx模型重建,而不要用文本编辑器去试图解决问题。因为面对大型项目中上千行的edmx文件,用文本编辑器修好的可能性实在是太小了。

当添加一个edmx模型的时候你会发现系统自动为我们生成了***.desinger.cs、***.tt、***.Context.tt、***.edmx.diagram文件。desinger和edmx.diagram分别为旧版context和图表文件,在开发中一般用处不大。其中desinger文件如果edmx启用了旧的objectcontext策略就会生成内容,并且需要项目引用system.data.entity程序集,否则会报错。如果你不想引用,只需要在desinger文件上右键->属性,生成操作选择无即可。

entity framework6 edmx文件详解的更多相关文章

  1. web.xml文件详解

      web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...

  2. tomcat 加载顺序 web.xml文件详解

    一. 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Se ...

  3. MyBatis 映射文件详解(六)

    MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上 ...

  4. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

  5. SUBLIME TEXT 2 设置文件详解

    SUBLIME TEXT 2 设置文件详解 Preferences.sublime-settings文件: // While you can edit this file, it’s best to ...

  6. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

  7. delphi 资源文件详解

    delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...

  8. VSFTPD全攻略(/etc/vsftpd/vsftpd.conf文件详解)

    /etc/vsftpd/vsftpd.conf文件详解,分好类,方便大家查找与学习 #################匿名权限控制############### anonymous_enable=YE ...

  9. jni.h头文件详解二

    作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shao ...

随机推荐

  1. B1019 数字黑洞 (20分)

    B1019 数字黑洞 (20分) 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复 ...

  2. java基础_单例模式

    java开发实战经典 --单例模式 从CSDN以及博客园的相关文章学习的,摘做笔记. “java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式 ...

  3. 网络抢票黄牛,大部分是骗人的。公布一个骗钱黄牛,QQ:2233261390,QQ群:29443597,支付页面:https://me.alipay.com/q336

    想着给女友买张回广州的回程火车票,抢了3天也没弄到.情急之下找了网络上所谓的黄牛.结果上当受骗.具体经过是这样的: 对方承诺抢到再付款.于是等他抢到后截图给我看,而且可以远程到他的机器去看,我也确实远 ...

  4. AutoMapper教程

    http://www.cnblogs.com/gc2013/p/4487567.html http://www.qeefee.com/article/automapper

  5. Python面向对象之什么是类(1)

    1.C#.Java :只能用面向对象编程 Ruby.Python :函数编程+ 面向对象 面向对象编程不是在所有地方都比函数式编程方便的,类是为了封装,下面是简单的使用方法 在创建类的时候要用clas ...

  6. 深入学习之mysql(五)连接查询

    深入学习Mysql(五)连接查询 1.准备数据库: CREATE DATABASE IF NOT EXISTS `db_book2` DEFAULT CHARACTER SET UTF8; USE ` ...

  7. order by 对null的处理

    [Oracle 结论] order by colum asc 时,null默认被放在最后order by colum desc 时,null默认被放在最前nulls first 时,强制null放在最 ...

  8. BZOJ 1452:[JSOI2009]Count(二维树状数组)

    [JSOI2009]Count 描述 输入 输出 1 2 分析: 裸二维bit,对每个颜色建一颗bit. program count; var bit:..,..,..]of longint; a:. ...

  9. 【bzoj2127】happiness 网络流最小割

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  10. html获取当前地址的参数

    //jsd代码 function UrlSearch(){       var name,value;       var str1 = "";       var str=loc ...