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

时间: 2025-01-27 20:32:14

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

ADO.NET EF中的实体修改方法_MsSql

1.传统修改模式,看下列代码 复制代码 代码如下: using (NorthwindEntities context = new NorthwindEntities()) { Region region = context.Region.FirstOrDefault(v => v.RegionID == 4); region.RegionDescription = "Test"; context.SaveChanges(); } 监控SQL语句: 复制代码 代码如下: SQL1:

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

有时需要在网上租用空间或数据库,Mysql成本低一些,所以想将sql server转成mysql-- 注意:在安装Mysql时要选择文字集为utf8,否则将不能使用中文(当前也可以在创建数据库时使用utf8,不过我不知道在ef生成数据库时如何设置,希望高手指点) 一.在项目中引用mysql的EF包 通过NuGet包管理器安装:EntityFramework6.1.3.MySql.Data.Entity6.9.8 也可以用nuget的命令行加入: Install-Package MySql.Dat

请问一下ef中 DbRawSqlQuery的使用方法

问题描述 请问一下大家,我下面的使用方法是正确的吗?为什么dt.Rows总是为0呢,明明Hr_Staff表中是有数据的.DbRawSqlQuery<DataTable>query=PlatMasterDbContext.PlatMasterDbContextInstance.Database.SqlQuery<DataTable>("select*FROMHr_Staff");DataTabledt=query.ToList()[0];intr=dt.Rows.

《中国人工智能学会通讯》——11.46 微博中的实体链接技术

11.46 微博中的实体链接技术 近来微博已成为互联网用户越来越重要的信息来源,每天有数亿条微博被产生出来.将微博中出现的命名实体链接到知识库中的对应实体有助于微博用户兴趣点的发现,以及微博推荐等应用.由于微博文本本身短小.随意且低质的特点,微博中的实体链接任务更具挑战性.自然语言文本中的实体链接技术主要针对万维网中的新闻文章,它们的基本想法是利用文本的相似性和同一文档中实体的主题一致性来进行链接.然而由于单条微博中包含的信息量非常有限,使得这些方法对于微博中的实体链接任务不能取得很好的效果.我

EF code first 实体类修改、添加、删除操作问题

问题描述 EF code first 实体类修改.添加.删除操作问题 EF code First 怎么来更新已存在的数据库结构? 比如:在实体类中我新添加了一个字段.修改字段名称或者类型.删除一个字段 等操作后我怎么更新到已存在的数据库对于表中去. 担心:我在持续开发中,改变了数据库的结构,如果这时候用户已经用以前的版本创建好数据库并且有了许多数据,假使我的修改只增加了一个表的一个可空列.而为此我只能重新创建数据库.请问有没有别的办法,能够把新的数据库结构在不损伤数据的情况下更新到部署好的环境中

请问EF中如何移除掉DbContext中新增的实体

问题描述 比如我有一段代码:try{foreach(Models.Configurationmodinnew_data){PlatDbContext.PlatDbContextInstance.Configuration.Add(mod);}--PlatDbContext.PlatDbContextInstance.SaveChanges();}catch(Exceptionex){throwex}代码在PlatDbContext.PlatDbContextInstance.SaveChange

JS批量修改PS中图层名称的方法

 批量修改PS中图层名称的方法有很多,在本文为大家介绍下使用js是如何实现的  代码如下: #target photoshopapp.bringToFront();  if (documents.length == 0) {  alert("没有可处理的文档");  } else {  var visibility = false;  var docRef = activeDocument;  var layers = docRef.layers;  if (layers.length

jQuery EasyUI中的日期控件DateBox修改方法_jquery

jQuery EasyUI中的日期控件DateBox很好用的,首先需要引入jquery文件,代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Basic DateBox - jQuery EasyUI Demo</title> <link rel="stylesheet" type="text/cs

android:在Activity如何写一种方法,当调用时可以永久的向原来的布局中增添或修改控件?

问题描述 android:在Activity如何写一种方法,当调用时可以永久的向原来的布局中增添或修改控件? 如题,在Activity如何写一种方法,当调用时可以永久的向原来的布局中增添或修改控件? 解决方案 不明白干嘛,添加控件,无非就是先创建或渲染出一个view,然后通过addview加入到指定的容器中 解决方案二: 可控的话 先写在xml中设visible为gone. 需要的时候设置为visible 解决方案三: 不太清楚你的意思.如果就是添加界面的话,可以用两种方法,一种是楼上说的,可以