EntityFramework:状态变化与方法的关系[转载]
一.约定
OnModelCreating 有一些限制需要注意,例如:
1.表名不支持使用标签进行标注
2.最小长度在 OnModelCreating 中不支持
3.正则表达式在 OnModelCreating 中不支持
使用标注来丰富模型的验证规则
使用 OnModelCreated 来完成数据库的约束(主键,自增长,表名,列类型等等)
二.加载
Include:贪婪加载
var orders = from o in context.Orders.Include("OrderDetails")
where o.CustomerName == "Mac"
select o;
延迟加载
另外一个特性就是延迟加载,默认情况下,延迟加载被支持,如果你希望禁用它,必须显式声明,最好的位置是在 DbContext 的构造器中。
public MyDomainContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
当 EF 访问实体的子实体的时候是如何工作的呢?在访问的时候没有事件发生,EF 通过从你定义的实体派生一个动态的对象,然后覆盖你的子实体集合访问属性来实现。这就是为什么需要标记你的子实体集合属性为 virtual 的原因。
总结一下两种加载方式的特点
贪婪加载:
1.减少数据访问的延迟,在一次数据库的访问中返回所有的数据。
2.你需要知道你将作什么,并且显式声明
延迟加载:
1.非常宽容,因为只在需要的时候加载数据,不需要预先计划
2.可能因为数据访问的延迟而降低性能,考虑到每访问父实体的子实体时,就需要访问数据库。
所以遇到循环应该采用贪婪加载,否则每次循环都会访问数据库
EF中对实体状会有4种状态:
1.Added: 对象为新对象,并且已添加到对象上下文,但尚未调用SaveChange之前都是Added(期间若修改对象属性,对象状态 任为Added, 删除该对象时状态变为Detached)
4.Modified: 当对象的属性被修改时,如果 AutoDetectChangesEnabled=true,或者调用了DetectChanges(),那么该对象的状态 会被修改为Modified
2.Deleted: 调用对象集合把对象A Remove后,EF标记该对象为准备从数据库中删除,调用SaveChanges()后数据库删除该记录,
并且EF把该对象标记为Detached
3.Detached: 对象存在,但尚未被添加到上下文。
5.Unchanged: 当直接从数据库加载到上下文,或者调用Attach附加一个对象时,该对象的状态为Unchanged
状态变化:
Added Update -》 Added
Added Save -》 Unchanged
Added Remove -》 Detached
Modified Update -》 Modified
Modified Save -》 Unchanged
Modified Remove -》 Deleted
Deleted Update -》 Deleted
Deleted Save -》 Detached
Deleted Add -》 Added(数据库不会删除原来的数据,并且会新增一条数据)
Unchanged Add -》 Added
Unchanged Update -》 Modified
Unchanged Save -》 Unchanged
Unchanged Remove -》 Deleted
Detached Update -》 Detached
Detached Add -》 Added
Detached Remove -》 出错
OriginalValues:原先值,当对象附加或数据库加载(不是添加,添加时只有当前值没有原先值,添加后调用SaveChanges()才会有原先值)到上下文之后才有原先值。
1.对象被附加或者从数据库中读取到上下文时的值,SaveChanges()后的当前值与原先值保持一致。
CurrentValues:当前值,当对象上下文跟踪之后才有当前值。
1.最新的值,即被修改后的最新值,如果值未被修改,那么当前值与原先值一样。
ValidateOnSaveEnabled:保存前验证对象的属性最大最小长度等,默认为true。
1.如果ValidateOnSaveEnabled=true,那么SaveChanges()前不会调用DetectChanges(),
反之如果ValidateOnSaveEnabled=false,那么只有在AutoDetectChangesEnabled=true的情况下,
EF在SaveChanges()前才会调用DetectChanges()
AutoDetectChangesEnabled:自动跟踪对象的属性变化,默认为true。
1.如果关闭EF自动跟踪,在SaveChanges()前尚未手动调用DetectChanges(),那么保存不会生效。(前提:对象状态为Unchanged)
因为如果AutoDetectChangesEnabled=false,那么EF就不会自动跟踪对象属性的变化,从而导致对象的状态也不会变为Modified,
并且因为AutoDetectChangesEnabled=false,那么EF在SaveChanges() 实际保存到数据库之前不会调用DetectChanges(),
所以最终修改不会生效。
2.如果AutoDetectChangesEnabled=true,那么就算不调用DetectChanges(),EF在SaveChanges()时也能生效。
DetectChanges():同步对象与其属性的状态。
1.如果对象A的状态为Unchanged,A的属性A1状态为Modified,那么调用DetectChanges()后,A状态变为Modified
2.如果AutoDetectChangesEnabled=true,那么对象与其属性的状态会立即同步
AcceptAllChanges():上下文能跟踪状态为Added、Modified、Deleted的所有对象,修改他们的状态为Unchanged。在SaveChanges()失败时不 会调用该方法。
AcceptAllChangesAfterSave:标志SaveChanges()后调用AcceptAllChanges
1.EF6.0在SaveChanges()成功后始终会调用AcceptAllChanges(),把Added、Modified、Deleted的对象状态修改为Unchanged
DetectChangesBeforeSave:标志在SaveChanges()前,需要调用DetectChanges()同步所有状态
1.如果AutoDetectChangesEnabled=false,那么在SaveChanges()前,不会调用DetectChanges()同步所有状态
SaveChanges():
1.只有当AutoDetectChangesEnabled=true,ValidateOnSaveEnabled=false的情况下,在保存之前才会调用DetectChanges()
2.当保存成功后,始终都会调用AcceptAllChanges()
EntityFramework:状态变化与方法的关系[转载]的更多相关文章
- EntityFramework:状态变化与方法的关系
一.约定 OnModelCreated 有一些限制需要注意,例如: 1.表名不支持使用标签进行标注 2.最小长度在 OnModelCreated 中不支持 3.正则表达式在 O ...
- EntityFramework:状态变化与方法的关系(朋友的学习笔记)
一.约定OnModelCreating 有一些限制需要注意,例如: 1.表名不支持使用标签进行标注 2.最小长度在 OnModelCreating 中不支持 3.正则表达式在 OnModelCreat ...
- Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射? 写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:D ...
- 疑难杂症——关于EntityFramework的SqlQuery方法的执行效率差异的探讨
前言:最近项目上面遇到一个问题,在Code First模式里面使用EntityFramework的SqlQuery()方法查询非常慢,一条数据查询出来需要10秒以上的时间,可是将sql语句放在plsq ...
- Java Swing paint repaint update 方法的关系
Java Swing paint repaint update 方法的关系: 参考:http://blog.csdn.net/xiaoliangmeiny/article/details/691665 ...
- 几种序列化与get、set方法的关系
若get开头且第四个字母是大写的方法中有空指针异常时(无论有没有对应属性) 1.阿里巴巴的FastJson会出现空指针异常,证明与get开头的方法有关 2.Google的Gson不会出现异常,因为只和 ...
- 委托学习过程及委托、Lambda表达式和匿名方法的关系总结及事件总结
第一章,当开始学习委托的时候,我们会问什么是委托?为什么要学习委托? 一,什么是委托? 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法, ...
- 死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中, ...
- Android View.onMeasure方法的理解(转载)
一下内容转载自http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html View在屏幕上显示出来要先经过measure(计算)和layout(布局).1 ...
随机推荐
- bzoj2935 [Poi1999]原始生物——欧拉回路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2935 考察欧拉回路性质的题目呢: TJ:https://blog.csdn.net/u014 ...
- IJ:Idea 常用代码
ylbtech-IJ:Idea 常用代码 1.返回顶部 1. 1.JeePlus/代码生成器http://localhost:8081/a/login 2.manager/Java基础框架http:/ ...
- NSURLSession 和 NSURLConnection 的比较
一.NSURLConnection 1.iOS2.0出现,iOS9.0后废弃的网络请求发送方式 2.可以在初始化时确定发送同步还是异步的请求,并且可以选择执行队列. +(void)sendAsynch ...
- 0604-面向对象、类与对象、类、static、构造方法/析构方法
一.面向对象 1.面向过程:一个人分步骤完成某个事情 2.面向对象:某件事情拆分为多个任务,由每个对象独立完成,最后调用整合为一个完整的项目 3.三要素:继承.封装.多态. 封装:私有化属性 提供公共 ...
- python 46 盒模型 与盒模型布局
一:盒模型 1. 盒模型的概念 广义盒模型:文档中所有功能性及内容性标签,及文档中显示性标签 侠义盒模型:文档中以块级形式存在的标签(块级标签拥有盒模型100%特性且最常用) 盒模型组成:margi ...
- CodeForces A. Meeting of Old Friends
2019-05-30 20:19:57 加油!!! sort(a + 1, a + 5); 卡了一会儿 #include <bits/stdc++.h> using namespace s ...
- Google的网站性能优化最佳实践
网站性能最佳实践 当描述一个web页面的页面速度,评价的一致性遵循许多不同的规则.这些规则是任何阶段的web开发可以应用的前端最佳实践.这个文档的每个规则都陈述于此,无论你是否运行页面测速工具-- ...
- W3C标准冒泡、捕获机制
(一) 捕获和冒泡如何相互影响 我们来做几个任务吧! 有一个前提,#parent为标签,#child为子标签,他们是嵌套关系支线任务1 //捕获模式 document.getElementById(' ...
- Project Management -- How to use GitHub with Git
如何通过Git使用GitHub ——PM曾子轩 从未使用过Git 一.从官网下载Git 此部分略 二.用Git连接上GitHub(为保持完整性,此部分引用博客:https://www.cnblogs. ...
- 【SQL】含有NULL值的排序
查询结果中有NULL值,当进行升序排序时,NULL值默认为“最大值”,排在最后面.要想改变NULL值的显示顺序,只需要在SQL语句后面加上NULLS FIRST(排在前面),NULLS LAST(排在 ...