为什么更新引用不更新对象?

Why doesn't updating a reference update the object?

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

对象已更新。
问题:为什么传递整个对象不起作用?将整个对象而不是所有属性一一传递会更有效率。
抱歉这个冗长的问题,感谢您的回答。

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

事情是这样的:

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

这是一个例子:在重新分配对象引用之前看起来像这样:

赋值后的样子是这样的:

相比之下,您的第二个代码片段修改了 context 提供给您的原始对象。此对象已被跟踪,因此为其属性设置新值会导致在您保存更改时进行更新:

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

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

oldMyEntity = myEntity;

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

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