什么是ORM
起源随着编程的发展,程序里都是面向对象啥的,但是数据库发展呢 网状数据库 -》层次数据库 -》关系数据库(当然还有nosql数据库 我们只是做热数据缓存 后面将会讲到) 。关系型数据库一直流行到当今。
就出现了一个问题,程序里的发展和数据库的发展不匹配,一个面向对象 类什么,一个是行列结构 而且数据库的多样性,这种不协调就做阻抗失衡,所以就出现了ORM(Object Relational Mapping)。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(.net中这种类叫做POCO类,没有任何业务逻辑,数据库类最好也用CLR中的数据类型 例如 system.int 这种的),将程序中的对象自动持久化(持久化就是保存)到关系数据库中。
EF三种模式
其实这个是随着 EF版本的发展以及ObjectContext到DBContex 的发展而发展的。
1、DBFirst
就是先把数据库设计好,然后用在VS项目中添加新建项,添加一个来自数据库的EF设计器 edmx。(edmx是一个组件,最后会生成一个dll,里面有很多类,类的生成是根据T4模板生成的。T4模板的底层使用的是codedom)
上图中 选择模型内容,以前的版本中只有两个,后来变成四个。以前还有一个ef power tools,现在都用用不到了。本人认为上图中 来自数据库的Code First生成的代码使用的技术是codedom实现的。我是自己写的工具底层codedom,生成实体 以及一些其他数据操作类,业务操作类等。
EDMX其实就是一个xml文件,运行的时候被分为三个子文件,
*.csdl(conceptyal shema definition)概念模型(conceptual model),就是实体类。
*.ssdl(storage schema definition language) 存储模型(storage model),底层存储操作类。
*.msl(mapping specification language) 概念-存储模型映射,概念模型于存储模型的映射。
程序中EF第一使用会生成这个映射到缓存里。并且执行 protected override void OnModelCreating(DbModelBuilder modelBuilder)。这个方法也只会执行一次,以后再也不执行了。所以关于实体的配置一般都写在这个里面。能不写在构造函数里面的就不写在里面。但是禁用状态跟踪写在这个里没有效果(this.Configuration.AutoDetectChangesEnabled = false;)
所以大家说的第一次加载慢 就是因为这个操作,当然还有其他的原因。
//EF Pre-Generated Mapping Views(预生成映射视图) using (var dbcontext = new CustomContext()) { var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext; var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace); //DataSpace.CSSpace C 表示概念模型 S表示存储模型 mappingCollection.GenerateViews(new List<EdmSchemaError>()); //对程序中定义的所有DbContext逐一进行这个操作 }