gpt4 book ai didi

c# - 为什么更新引用不更新对象?

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:41 24 4
gpt4 key购买 nike

我有一个使用 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 检索到的对象保持不变。

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

Before assignment

赋值后,它看起来像这样:

After the assignment

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

Assigning a property

关于c# - 为什么更新引用不更新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30223895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com