ADO.NET EF 中的实体修改方法 <转>

简介:

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 来设置修改字段,使用该方法不必再执行查询将数据读入当前连接对象才能修改


 

原文地址:http://www.cnblogs.com/zfz15011/archive/2010/05/30/1747486.html

版权说明

本文转自温景良(Jason)博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2010/05/30/1747590.html,如需转载请自行联系原作者
相关文章
|
5月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
5月前
|
SQL 程序员
分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子
分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子
|
3月前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。
|
5月前
|
存储 开发框架 .NET
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
|
5月前
|
程序员 数据库
分享 2 个 .NET EF 6 只更新某些字段的方法
分享 2 个 .NET EF 6 只更新某些字段的方法
123 0
|
5月前
|
数据库
分享一个 .NET EF 6 扩展 Where 的方法
分享一个 .NET EF 6 扩展 Where 的方法
|
5月前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
|
5月前
|
SQL 程序员 数据库
总结查看 .NET EF 生成的 SQL 的 3 种方式,亲测可用
总结查看 .NET EF 生成的 SQL 的 3 种方式,亲测可用
144 0
|
5月前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
205 0
|
4天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统