http://www.cnblogs.com/zfz15011/archive/2010/05/30/1747486.html

1.传统修改模式,看下列代码

using (NorthwindEntities context = new NorthwindEntities())
{
    Region region = context.Region.FirstOrDefault(v => v.RegionID == 4);
    region.RegionDescription = "Test";
    context.SaveChanges();
}

监控SQL语句:

SQL1:SELECT TOP 1 [Extent1].[RegionID] AS [RegionID], [Extent1].[RegionDescription] AS [RegionDescription]FROM [dbo].[Region] AS [Extent1]WHERE 4 = [Extent1].[RegionID]
SQL2:exec sp_executesql N'update [dbo].[Region]set [RegionDescription] = @0where ([RegionID] = @1)', N'@0 nchar(4),@1 int', @0 = N'Test', @1 = 4

从这里例子中可以看出使用“传统模式”的数据更新,必须先要执行一次查询,将获取要更新的实体对象,在看下面的例子:

Region region;
using (NorthwindEntities context = new NorthwindEntities())
{
    region = context.Region.FirstOrDefault(v => v.RegionID == 4);
}
using (NorthwindEntities context = new NorthwindEntities())
{
    region.RegionDescription = "Test";
    context.SaveChanges();
}

更新是不会执行的,因为实体不再 执行 SaveChanges 的对象中所以 当我们更新一个 不再当前连接中的对象是必须要先执行查询获取这个对象才能对其更新,如下:

Region region;
using (NorthwindEntities context = new NorthwindEntities())
{
    region = context.Region.FirstOrDefault(v => v.RegionID == 4);
}
using (NorthwindEntities context = new NorthwindEntities())
{
    Region newRegion = context.Region.FirstOrDefault(v => v.RegionID == region.RegionID);
    region.RegionDescription = "Test";
    context.SaveChanges();
}

2.使用ApplyPropertyChanges 修改实体

Region region;
using (NorthwindEntities ne = new NorthwindEntities())
{
    //利用EntityObject.Execute(MergeOption.NoTracking),等效于使用ObjectContext.Dettach(EntityObject)
    //查询并分离对象
    region = ne.Region.Execute(MergeOption.NoTracking).Where(v => v.RegionID == 1).FirstOrDefault();
}
//修改分离的值
region.RegionDescription = "TestTest1";
//使用分离的对象 order 更新 
using (NorthwindEntities context = new NorthwindEntities())
{
    //将数据载入到context中以便更新
    context.GetObjectByKey(region.EntityKey);
    //使用order 更新 context中的对应对象
    context.ApplyPropertyChanges(region.EntityKey.EntitySetName, region);
    context.SaveChanges();
}

监控SQL语句:

SQL1:exec sp_executesql N'SELECT [Extent1].[RegionID] AS [RegionID], [Extent1].[RegionDescription] AS [RegionDescription] FROM [dbo].[Region] AS [Extent1] WHERE [Extent1].[RegionID] = @p0', N'@p0 int', @p0 = 1
SQL2:exec sp_executesql N'update [dbo].[Region] set [RegionDescription] = @0where ([RegionID] = @1) ', N'@0 nchar(9),@1 int', @0 = N'TestTest1', @1 = 1

ApplyPropertyChanges在MSDN的解释是“将已分离对象的属性更改应用于已附加到对象上下文的对象。”其实说白了就是 拿旧对象去更新新对象,我们可以看出 使用“ApplyPropertyChanges 修改实体”方法修改实体与 使用“传统模式”是一样的,都是必须先执行一次查询,获取更新的对象,但是 ApplyPropertyChanges方法的特殊之处是,该方法会拿内存中的对象(新对象)和当前连接中的对象(旧对象)对比,自动生成对应字段修改的Update语句,如果内存中的对象与当前连接中的对象完全相等(每个字段的值都相等),将不生成响应的Update。当我们再次执行 上述代码观察监控到了SQL语句,你会发现只监控到SQL1,不会得到SQL2。

3.使用Attach与SetModifiedProperty修改实体

using (NorthwindEntities context = new NorthwindEntities())
{
    Region region = context.Region.FirstOrDefault(v => v.RegionID == 4);
    context.Detach(region);
    region.RegionDescription = "因为测试";

context.Attach(region);
    var newRegion = context.ObjectStateManager.GetObjectStateEntry(region);
    newRegion.SetModified();
    newRegion.SetModifiedProperty("RegionDescription");

context.SaveChanges();
}

监视SQL语句:

exec sp_executesql N'update [dbo].[Region]set [RegionDescription] = @0where ([RegionID] = @1)', N'@0 nchar(4),@1 int', @0 = N'因为测试', @1 = 4

使用该方法,可以将不再当前连接集合中的实体使用Attach方法加入到当前集合中 在使用 SetModifiedProperty 来设置修改字段,使用该方法不必再执行查询将数据读入当前连接对象才能修改

ADO.NET EF 中的实体修改方法的更多相关文章

  1. 6.翻译:EF基础系列---什么是EF中的实体?

    原文地址:http://www.entityframeworktutorial.net/basics/what-is-entity-in-entityframework.aspx EF中的实体就是继承 ...

  2. EF4.1: Add/Attach and Entity States(EF中的实体状态转换说明)

    实体的状态,连接以及 SaveChanges 方法 数据库上下文对象维护内存中的对象与数据库中数据行之间的同步.这些信息在调用 SaveChanges方法被调用的时候使用.例如,当使用 Add 方法传 ...

  3. Entity Framework入门教程(4)---EF中的实体关系

    这一节将总结EF是怎么管理实体之间的关系.EF与数据库一样支持三种关系类型:①一对一 ,②一对多,③多对多. 下边是一个SchoolDB数据库的实体数据模型,图中包含所有的实体和各个实体间的关系.通过 ...

  4. EF中的实体类型【Types of Entity in Entity】(EF基础系列篇8)

    We created EDM for existing database in the previous section. As you have learned in the previous se ...

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

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

  6. 在EF中使用MySQL的方法及常见问题

    有时需要在网上租用空间或数据库,Mysql成本低一些,所以想将sql server转成mysql…… 注意:在安装Mysql时要选择文字集为utf8,否则将不能使用中文(当前也可以在创建数据库时使用u ...

  7. EF中的实体关系

    导航属性的理解: 指数据库的表所对应的实体类,除了要有每个字段所对应的属性之外,还应该有一个与之有关联的表的属性,一对一的关系就是关联表的类型,一对多的关系就是关联表的类型的ICollection的泛 ...

  8. EF中使用Select new 方法中字段值替换的问题

    前提需要替换查询得到的List当中的某个字段的值,替换规则有一个mapping关系 尝试代码 有问题 无法获取任何数据 /// <summary> /// 获取Treegrid的List ...

  9. .NET中微软实体框架的数据访问方法

    介绍 本文的目的是解释微软的实体框架提供的三种数据访问方法.网上有好几篇关于这个话题的好文章,但是我想以一个教程的形式更详细地介绍这个话题,这个教程对于开始学习实体框架及其方法的人来说是个入门.我们将 ...

随机推荐

  1. bzoj3601

    题解:gi(pq=pqi-pqi+di 至于为什么,可以看看往上的题解 代码: #include<bits/stdc++.h> using namespace std; typedef l ...

  2. Python Django 之 Template 模板语言简介

    一.什么事模板语言 html+逻辑控制语句 二.模板语言的作用 帮助前端处理后端发来的数据,方便前端展示(杂糅渲染) 三.模板语言语法 1.{{变量}} 变量使用双大括号{{}} 2.万能的句点号. ...

  3. 链表(list)的实现(c语言)

    链表是一种基本的数据结构,今天练习了一下,所以将代码贴在下面,代码测试通过,代码还可以优化,我会过段时间就会增加一部分或者优化一部分直达代码无法优化为止,我的所有数据结构和算法都会用这样的方式在博客上 ...

  4. android机顶盒真机调试方法

    最近接触电视APP开发,之前对Android开发也不太了解还一直以为不能真机调试.最近静下心来想一想肯定能真机调试的,我是我不知道而已.现在讲述一下真机调试的步骤: 1.进入设置--关于,连续点击版本 ...

  5. 解决Ubuntu下adb无法联接手机终端

    1.首先确认开发者选项中USB调试是否打开. 2.在终端输入lsusb,如下图: 查看设备是否已经连接,如果没有此选项,请检查你的手机数据线是否正常连接,否则你的手机就可以用来防身和砸核桃了. 3.在 ...

  6. pyqt5:图片自适应QLabel大小和图片移除

    参考链接: https://www.e-learn.cn/content/qita/669569 图片自适应QLabel大小 # coding=utf- import sys from PyQt5.Q ...

  7. C语言基础:结构体 分类: iOS学习 c语言基础 2015-06-10 21:47 28人阅读 评论(0) 收藏

    结构体:是一种用户自定义的数据类型 结构体定义 struct 结构体名 {     成员类型1  成员变量名1;     成员类型2  成员变量名2;      -. }; typedef   原类型 ...

  8. 安装SharePoint Server的主机重命名

    今天我头脑一热, 把安装在WS 2008 R2上的有Stand-alone SharePoint Server 2010的机器重命名了一下, 结果SharePoint Central Admin都进不 ...

  9. linux-推荐两款好用的录屏软件

    前言 测试程序过程中需要看运行效果如何,可以使用录屏软件进行回放. 软件安装 添加源:sudo add-apt-repository ppa:maarten-baert/simplescreenrec ...

  10. 微软更新导致的IIS7设置默认主页无效

    近期两个superKM的老客户出现问题,网站不能自动检索默认文档,必须通过完整网址才能访问. 值得一提的是出现问题的都是 IIS7 和7.5版本,服务器为windows server2008 R2. ...