博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADO.NET EF 中的实体修改方法 <转>
阅读量:6226 次
发布时间:2019-06-21

本文共 3486 字,大约阅读时间需要 11 分钟。

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

using
 (NorthwindEntities context 
=
 
new
 NorthwindEntities())
{

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

监控语句:

 

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


 

原文地址:

版权说明
本文转自温景良(Jason)博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2010/05/30/1747590.html,如需转载请自行联系原作者
你可能感兴趣的文章
超级有用的15个mysqlbinlog命令
查看>>
数据库之间转移数据
查看>>
PHP连接Mysql常用API(mysql,mysqli,pdo)区别与联系
查看>>
java中的CAS
查看>>
简单的markdown在线解析服务
查看>>
Linux基础(day44)
查看>>
Git 分支创建及使用
查看>>
MariaDB安装, Apache安装
查看>>
多线程三分钟就可以入个门了!
查看>>
从道法术三个层面理解区块链:术
查看>>
elasticsearch入门使用
查看>>
数据结构与算法4
查看>>
tomcat去掉项目名称
查看>>
微服务架构的优势与不足(一)
查看>>
分布式服务治理框架Dubbo
查看>>
小程序好的ui框架选择
查看>>
今天学习了
查看>>
Tomcat安装、配置、优化及负载均衡详解
查看>>
虹软人脸识别SDK(java+linux/window) 初试
查看>>
ppwjs之bootstrap文字排版:到标题元素
查看>>