什么是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-初识EF-初识

上图中 选择模型内容,以前的版本中只有两个,后来变成四个。以前还有一个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逐一进行这个操作
}
这段代码一般放在项目入口问题,只执行一次。ASP.NET中放在Application_Start里面

相关文章:

  • 2021-12-08
  • 2022-12-23
  • 2022-12-23
  • 2021-09-01
  • 2022-02-13
  • 2021-10-10
  • 2021-12-17
  • 2022-12-23
猜你喜欢
  • 2021-12-07
  • 2021-10-25
  • 2021-10-19
  • 2022-01-08
  • 2022-02-19
  • 2022-01-10
相关资源
相似解决方案