一.约定   
OnModelCreated 有一些限制需要注意,例如:   
1.表名不支持使用标签进行标注   
2.最小长度在 OnModelCreated 中不支持   
3.正则表达式在 OnModelCreated 中不支持 

使用标注来丰富模型的验证规则   
    使用 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 -》 Detached

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:状态变化与方法的关系的更多相关文章

  1. EntityFramework:状态变化与方法的关系(朋友的学习笔记)

    一.约定OnModelCreating 有一些限制需要注意,例如: 1.表名不支持使用标签进行标注 2.最小长度在 OnModelCreating 中不支持 3.正则表达式在 OnModelCreat ...

  2. EntityFramework:状态变化与方法的关系[转载]

    原文地址 一.约定 OnModelCreating 有一些限制需要注意,例如: 1.表名不支持使用标签进行标注 2.最小长度在 OnModelCreating 中不支持 3.正则表达式在 OnMode ...

  3. Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射? 写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:D ...

  4. Java Swing paint repaint update 方法的关系

    Java Swing paint repaint update 方法的关系: 参考:http://blog.csdn.net/xiaoliangmeiny/article/details/691665 ...

  5. 疑难杂症——关于EntityFramework的SqlQuery方法的执行效率差异的探讨

    前言:最近项目上面遇到一个问题,在Code First模式里面使用EntityFramework的SqlQuery()方法查询非常慢,一条数据查询出来需要10秒以上的时间,可是将sql语句放在plsq ...

  6. 几种序列化与get、set方法的关系

    若get开头且第四个字母是大写的方法中有空指针异常时(无论有没有对应属性) 1.阿里巴巴的FastJson会出现空指针异常,证明与get开头的方法有关 2.Google的Gson不会出现异常,因为只和 ...

  7. 委托学习过程及委托、Lambda表达式和匿名方法的关系总结及事件总结

    第一章,当开始学习委托的时候,我们会问什么是委托?为什么要学习委托? 一,什么是委托? 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法, ...

  8. 死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中, ...

  9. [转]EntityFramework状态变化AutoDetectChangesEnabled与SaveChanged参数说明

    一.约定OnModelCreating 有一些限制需要注意,例如:1.表名不支持使用标签进行标注2.最小长度在 OnModelCreating 中不支持3.正则表达式在 OnModelCreating ...

随机推荐

  1. Swing中弹出对话框的几种方式(转)

    http://www.cnblogs.com/mailingfeng/archive/2011/12/28/2304289.html 在swing中,基于业务的考量,会有对话框来限制用户的行为及对用户 ...

  2. HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法

    联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  3. 【Unity技能】做一个简单的NPC

    1. 写在前面 前几天我看到cgcookie一个教程.学习了下怎么依据已有人物模型制作一个仿版的NPC人物.感觉挺好玩的,整理一下放到博客里! 先看一下教程里面的终于效果. 是不是非常像个幽灵~ 以下 ...

  4. Cocos2d-x3.1回调函数具体解释

    Cocos2d-x3.1回调函数的定义CCRef.h声明.源代码,例如,下面的: typedef void (Ref::*SEL_CallFunc)(); typedef void (Ref::*SE ...

  5. poj 2408 Anagram Groups(hash)

    id=2408" target="_blank" style="">题目链接:poj 2408 Anagram Groups 题目大意:给定若干 ...

  6. gdb经常使用的命令

    在调试程序的时候,gdb是一柄利器,恰当的使用gdb能够解决掉程序的很多bug. gdb并不检查语法错误.那是gcc或者g++的事情,gdb干的是调试的事情. 说明: (1)gdb 程序名 [core ...

  7. Android于JNI调用列出的程序

    1.安装和下载cygwin,下载Android NDK: 2.于ndk工程JNI接口设计: 3.采用C/C++实现本地方法. 4.JNI生成动态链接库.so档: 5.动态链接库副本javaprojec ...

  8. tomcatport占用,如何识别和kill

    开始-执行-cmd,进netstat -ano你可以看到整个port入住. 增加要想知道谁占用了我们的port8080,输入下面命令 C:\Documents and Settings\Adminis ...

  9. Base64编码 概念和用途

    Base64概念 什么是Base64? 依照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把随意序列的8位字节描写叙述为一种不易被人直接识别的形式.(The Base6 ...

  10. Visual Studio 原生开发的10个调试技巧(二)

    原文:Visual Studio 原生开发的10个调试技巧(二) 我以前关于 Visual Studio 调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原 ...