如何使用 dbcontext SaveChanges 将修改后的记录推送到数据库?
Posted
技术标签:
【中文标题】如何使用 dbcontext SaveChanges 将修改后的记录推送到数据库?【英文标题】:How to push modified record to DB using dbcontext SaveChanges? 【发布时间】:2017-02-01 11:01:26 【问题描述】:我在本地修改了一个对象,然后将其传递给 DAL 以在连接的数据库上进行更新。
通常我会使用存储过程并执行读取器来更新数据库,但这个项目改为实现数据库上下文。
但是当我运行该方法来保存更改时,它返回时没有错误,并且数据库中的记录没有更新。
在这里搜索我遇到this question 建议在调用保存之前将数据库记录标记为修改状态。哪个没有纠正问题。
问题:
这是 DAL 方法的要点:
public void update_Release_Status(Status recordModified)
//Get the original record and update with the modified values.
Status recordOriginal = db3.Status .First(i => i.ID == recordModified.ID);
db3.Entry(recordOriginal).State = System.Data.Entity.EntityState.Modified; //marked as modified here before saving
recordOriginal = recordModified;
db3.SaveChanges();
【问题讨论】:
您实际上从未对recordOriginal
的实例进行任何更改,因此无需更新。您可以在recordOriginal
上设置单个字段而不是完全替换变量引用吗?或者,如果它最初来自数据库上下文,您可以将 recordModified
附加到上下文中? (它是从哪里来的?)
这个解决方案对你有用还是什么? ***.com/a/39663331/1077309
【参考方案1】:
你的实体是connected
(或tracked
)之一。所以你不需要这样做db3.Entry(recordOriginal).State = System.Data.Entity.EntityState.Modified;
注意:您必须将传入对象的属性映射到获取的对象。您可以使用 Mapper API 或手动执行此操作,如下所示。
public void update_Release_Status(Status recordModified)
Status recordOriginal = db3.Status.First(i => i.ID == recordModified.ID);
recordOriginal.Name = recordModified.Name;//here you have to do the mapping
recordOriginal.Age=recordModified.Age; //just used fake property names :)
db3.SaveChanges();
【讨论】:
这不会有完全相同的问题吗?从 DB 上下文中获取的实际对象永远不会被修改。没有要保存的更改。 这是修改部分recordOriginal = recordModified;
。来自他的方法。@David
是的,但recordModified
是否完全附加到数据库上下文?遇到的问题意味着它不是。如果是的话,为什么还要获取一个单独的实例呢?本质上,您是从数据库上下文中获取一个对象,然后从不对该对象做任何事情。那么为什么要拿它呢?您在此处显示的整个方法可以简化为仅最后一行。
无需将此recordModified
附加到context
。因为我们正在更新attached or tracked
recordOriginal
实体。就像这样,比如说recordOriginal.Name="David";
然后db3.SaveChanges();
。就是这样。 @大卫
这不是引用变量在 C#(或我见过的任何语言)中的工作方式。 recordOriginal = recordModified;
不会单独更新recordOriginal
上的属性以匹配recordModified
上的属性,它只是更新变量引用本身以指向另一个对象。因此,recordOriginal
变量之前引用的实际对象仍然在堆上,未修改,并且可以立即用于垃圾回收,因为没有对它的引用。以上是关于如何使用 dbcontext SaveChanges 将修改后的记录推送到数据库?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Lazyloading,如何在处理完其 DBContext 后使用新的 DbContext 加载相关对象?