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. Mybaits(3),映射文件详解

    Mybaits(3),映射文件详解 MyBatis 的真正强大在于它的语句映射,这是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对 ...

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

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  3. Mybatis复习笔记3:映射文件详解

    映射文件详解 参数处理(#和$的区别) #{}:可以获取map中的值或者实体对象属性的值: ${}:可以获取map中的值或者实体对象属性的值: select * from person where i ...

  4. Android - Manifest 文件 详解

    Manifest 文件 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/20899281 Manifest可以定义应用程序及其 ...

  5. javaweb web.xml文件详解

    web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程.web.xml主要用来配置Filter.Listener.Servlet等 ...

  6. oracle控制文件都一样么,Oracle控制文件详解

    一.Oracle控制文件 为二进制文件,初始化大小由CREATEDATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等 ...

  7. linux /proc目录文件详解

    Linux中/proc目录下文件详解(一) /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化.命令proc ...

  8. STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解

    一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的. Corte ...

  9. /etc/passwd 文件详解

    /etc/passwd  文件详解 /etc/passwd  保存了系统中每一个用户的信息 /etc/passwd 中每个用户的信息占用了一行,也就是说这个文件有多少行,系统就有多少个用户. 要查看系 ...

最新文章

  1. django之全文检索
  2. Python(四)IP代理
  3. mongoDB的常见命令
  4. Java 网络编程1
  5. JCP执行委员会新成员选举结果揭晓:Hologic未获通过
  6. python keyerror_盘点Python 初学者最容易犯的10大错误!你中招了吗?
  7. 二分法的计算机应用,二分法(数学领域术语)_百度百科
  8. grid.getSelectionModel的所有操作
  9. r720换固态硬盘后如何重装系统_联想R720重装Winddows10无法识别固态硬盘咋办
  10. Flex 学习笔记 提高编译速度
  11. php 页面跳转 url地址不变,【后端开发】php跳转页面url不变
  12. 数据库 软件实施 工程师
  13. 小白入,告诉你.ssh新建config文件究竟是哪种文件!
  14. Linux命令brctl介绍
  15. 一步一步教你安装并登陆My SQL(最详细教程,没有之一)
  16. 关于onclick=open([Object obj],[Object obj])的问题
  17. 《摩根写给儿子的32封信》 03 企业家的资质
  18. 梦三花重金修改服务器,3月6日一梦江湖游戏更新公告
  19. [dlang](4)自定义的mysql orm工具
  20. linux 自带的python软连接被误删恢复

热门文章

  1. Leetcode143. Reorder List重排链表
  2. C# VS2017 winForm 使tableLayoutPanel 不闪烁
  3. Maven国内镜像 Maven阿里云镜像
  4. 粉红小猪中有一个叫“快乐小鸡”的游戏
  5. codeforce 606A - Magic Spheres
  6. WPF 获得文件夹路径 FolderBrowserDialog
  7. 282. Expression Add Operators
  8. [Leetcode][JAVA][第1111题][栈思想]
  9. anaconda中的python如何进行关联分析_Anaconda、Miniconda、Conda、pip的相互关系
  10. java处理中文字符串_Java实现读取文章中重复出现的中文字符串