我有一个带有Entity Framework存储库模式的项目来管理数据库中的对象。我想知道为什么不通过传递新对象的引用来更新对象。 (问题可能有点不准确,但你会用代码得到图片)
我的更新方法如下:
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();
}
对象按原样更新 问题:为什么没有传递整个对象?传递整个对象而不是一个接一个地传递所有属性会更有效。 对于冗长的问题,感谢您的回答。
答案 0 :(得分:5)
您的第一个代码段中发生的事情不是对引用对象的更新,它是对对象引用的更新,而对象本身保持不变。
以下是发生的事情:
MyEntity
获取context
个对象。context
检索的对象保持不变。这是一个例子:在重新分配对象引用之前如下所示:
分配后,它看起来像这样:
相反,您的第二个代码段会修改context
为您提供的原始对象。跟踪此对象,因此在其属性中设置新值会导致保存更改时的更新:
答案 1 :(得分:1)
你几乎自己回答了这个问题。
oldMyEntity是对象的引用 - 当您执行赋值时
oldMyEntity = myEntity;
您将引用更改为指向另一个对象而前一个引用已丢失 - 因此您永远不会更改任何值,并且没有更改的值可以保存。
您的第二个示例有效,因为您保留对从上下文加载的对象的引用,并将该特定对象中的值更改为其他对象