自动追踪

EF框架会自动追踪实体的变化(通过比较实体的当前值与原始值)。

默认情况下,以下方法会自动触发实体变化的追踪

  • DbSet.Find
  • DbSet.Local
  • DbSet.Remove
  • DbSet.Add
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

在循环添加大量实体时,可以通过关闭自动追踪功能提升性能,但在循环结束后要开启

using (var context = new BloggingContext())
{
try
{
context.Configuration.AutoDetectChangesEnabled = false; // Make many calls in a loop
foreach (var blog in aLotOfBlogs)
{
context.Blogs.Add(blog);
}
}
finally
{
context.Configuration.AutoDetectChangesEnabled = true;
}
}

如果没有开启自动追踪功能,当实体变化时,无法自动更新到数据库中的。可以通过使用content.ChangeTracker.DetectChanges方法手动检测

      static void Main(string[] args)
{
using (var db=new SchoolEntities2())
{
db.Configuration.AutoDetectChangesEnabled = false;//禁用自动追踪
var author = db.Authors.Find(1);
author.Name = "112";
db.ChangeTracker.DetectChanges();//手动检测实体
Console.WriteLine(db.Entry(author).State);
db.SaveChanges();
} Console.WriteLine("ok");
Console.ReadLine( );

在只读场景下,当查询大量数据时,可以通过禁用实体的追踪来提升性能

using (var context = new BloggingContext())
{
// Query for all blogs without tracking them
var blogs1 = context.Blogs.AsNoTracking(); // Query for some blogs without tracking them
var blogs2 = context.Blogs
.Where(b => b.Name.Contains(".NET"))
.AsNoTracking()
.ToList();
}

代理

为 POCO 实体类型创建实例时,实体框架常常为充当实体代理的动态生成的派生类型创建实例。此代理重写实体的某些虚拟属性,从而自动执行操作。例如,此机制用于支持关系的延迟加载。

禁止创建代理

this.Configuration.ProxyCreationEnabled = false;

显示创建代理实例

var blog = context.Blogs.Create();

从代理类型获取实际实体类型

var blog = context.Blogs.Find(1);
var entityType = ObjectContext.GetObjectType(blog.GetType());

如果传递给 GetObjectType 的类型是非代理类型的实体类型的实例,则仍将返回实体的类型。这意味着,始终可以使用此方法获取实际的实体类型,而不用再检查类型是否是代理类型。

EF中的自动追踪与代理的更多相关文章

  1. 7.翻译:EF基础系列---EF中的实体类型

    原文地址:http://www.entityframeworktutorial.net/Types-of-Entities.aspx 在Entity Framework中有两种实体类型:一种是POCO ...

  2. easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)

    easyui datagrid 禁止选中行   没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...

  3. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  4. 2.EF中 Code-First 方式的数据库迁移

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...

  5. EF中扩展出Between操作符 (修订版)

    随手记录一下,这是针对原文错误的修改. 原文:EF中扩展出Between操作符 直接使用是错误的,修改后的扩展方法: /// <summary> /// 扩展 Between 操作符 // ...

  6. 如何在EF中实现left join(左联接)查询

    在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...

  7. Spring中的cglib动态代理

    Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...

  8. Spring中的JDK动态代理

    Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...

  9. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

随机推荐

  1. Convert String to Long

    问题: Given a string, write a routine that converts the string to a long, without using the built in f ...

  2. SQL中删除同一字段中重复的值

    /////////////////////目地:ZDJZ_DIS中 name字段有重复的值,删除重复的值 DELETE * FROM ZDJZ_DIS WHERE NAME IN (select NA ...

  3. Centos 6.5 搭建php环境(nginx+mariadb+php7)

    1.mariaDb vim /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.or ...

  4. ubuntu下 使用AB做压力测试

    1最近刚开始接触apache大数据下数据优化,讲一下apache 下ab压力测试工具. 程序“ab”尚未安装. 您可以使用以下命令安装: apt-get install apache2-utils 以 ...

  5. Razor视图引擎

    在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. (1)Razor文件类型: ...

  6. 无效的过程调用或参数: 'Instr'解决方法

    以前我一直使用ASP无组件上传类来上传文件.但是今天又个客户反映说.不能上传.出现错误.,但在我电脑上测试没问题.后来发现客户用的是IE8 于是开始找解决方法 错误如下:Microsoft VBScr ...

  7. 使用国内镜像更新sdk方法

    使用国内的镜像资源: 1.mirrors.neusoft.edu.cn //东软信息学院 2.ubuntu.buct.edu.cn/ubuntu.buct.cn //北京化工大学 3.mirrors. ...

  8. 编译TWRP-recovery教程及源码地址

    TWRP这个是一个老外的开源项目,全称Team-Win-Recovery-Project Source:https://github.com/TeamWin/Team-Win-Recovery-Pro ...

  9. 装饰者模式 (decorator pattern)

    参考 : Head First 设计模式(中文版) 这篇只作为个人温习! 用意 : 动态地给一个对象添加|扩展一些行为.Decorator 强调用对象组合而非继承来实现扩展,这显得较为灵活. 角色: ...

  10. OSSEC配置

    http://gavinshaw.blog.51cto.com/385947/1020540