为什么不更新参考更新对象?

时间:2015-05-13 19:45:00

标签: c# entity-framework oop crud

我有一个带有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();
}

对象按原样更新 问题:为什么没有传递整个对象?传递整个对象而不是一个接一个地传递所有属性会更有效。 对于冗长的问题,感谢您的回答。

2 个答案:

答案 0 :(得分:5)

您的第一个代码段中发生的事情不是对引用对象的更新,它是对对象引用的更新,而对象本身保持不变。

以下是发生的事情:

  • 第一行从MyEntity获取context个对象。
  • 第二行用对另一个对象的引用替换对该对象的引用。
  • 您刚刚检索到的对象不再可以直接访问,并且尚未修改。
  • 上下文没有保存更改,因为从context检索的对象保持不变。

这是一个例子:在重新分配对象引用之前如下所示:

Before assignment

分配后,它看起来像这样:

After the assignment

相反,您的第二个代码段会修改context为您提供的原始对象。跟踪此对象,因此在其属性中设置新值会导致保存更改时的更新:

Assigning a property

答案 1 :(得分:1)

你几乎自己回答了这个问题。

oldMyEntity是对象的引用 - 当您执行赋值时

oldMyEntity = myEntity;

您将引用更改为指向另一个对象而前一个引用已丢失 - 因此您永远不会更改任何值,并且没有更改的值可以保存。

您的第二个示例有效,因为您保留对从上下文加载的对象的引用,并将该特定对象中的值更改为其他对象