我有一个带有实体框架存储库模式的项目来管理数据库中的对象。我想知道为什么对象不通过传递新对象的引用来进行更新。(问题可能有点不准确,但你可以用代码了解情况)
我的更新方法如下:
public void UpdateMyEntity(MyEntity myEntity)
{
MyEntity oldMyEntity = context.MyEntities.Where(m => m.Id == myEntity.Id).FirstOrDefault();
oldMyEntity = myEntity;
context.SaveChanges();
}
现在,我检查了oldMyEntity
上的属性是否与myEntity
上的属性相匹配,所以我可以假设数据库中的对象被更新了。由于某种原因,情况并非如此。如果我将代码更改为:
public void UpdateMyEntity(MyEntity myEntity)
{
MyEntity oldMyEntity = context.MyEntities.Where(m => m.Id == myEntity.Id).FirstOrDefault();
oldMyEntity.MyProperty = myEntity.MyProperty;
context.SaveChanges();
}
对象将按其应有的方式进行更新。
问题:为什么不能传递整个对象?传递整个对象(而不是所有属性)的效率要高得多。
很抱歉提出这个冗长的问题,谢谢你的回答。
发布于 2015-05-13 19:55:09
在第一个代码段中发生的不是由引用对象的更新,而是对对象的引用的更新,而对象本身保持不变。
下面是发生的情况:
MyEntity
获取context
对象。context
检索的对象保持未修改。下面是一个示例:在重新分配对象引用之前,如下所示:
任务完成后,如下所示:
相反,您的第二个代码片段修改了context
给您的原始对象。跟踪此对象,因此将新值设置为其属性将导致在保存更改时进行更新:
发布于 2015-05-13 19:55:30
你几乎自己回答了这个问题。
oldMyEntity是对对象的引用--当您执行赋值时
oldMyEntity = myEntity;
您将引用更改为指向另一个对象,而前面的引用将丢失-因此您永远不会更改任何值,也不会保存任何更改的值。
第二个示例之所以有效,是因为您保留了对从上下文加载的对象的引用,并将该特定对象中的值更改为其他对象。
https://stackoverflow.com/questions/30223895
复制相似问题