首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不更新引用更新对象?

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

Stack Overflow用户
提问于 2015-05-13 19:44:59
回答 2查看 1.9K关注 0票数 1

我有一个带有实体框架存储库模式的项目来管理数据库中的对象。我想知道为什么对象不通过传递新对象的引用来进行更新。(问题可能有点不准确,但你可以用代码了解情况)

我的更新方法如下:

代码语言:javascript
运行
复制
public void UpdateMyEntity(MyEntity myEntity)
{
    MyEntity oldMyEntity = context.MyEntities.Where(m => m.Id == myEntity.Id).FirstOrDefault();
    oldMyEntity = myEntity;
    context.SaveChanges();
}

现在,我检查了oldMyEntity上的属性是否与myEntity上的属性相匹配,所以我可以假设数据库中的对象被更新了。由于某种原因,情况并非如此。如果我将代码更改为:

代码语言:javascript
运行
复制
public void UpdateMyEntity(MyEntity myEntity)
{
    MyEntity oldMyEntity = context.MyEntities.Where(m => m.Id == myEntity.Id).FirstOrDefault();
    oldMyEntity.MyProperty = myEntity.MyProperty;
    context.SaveChanges();
}

对象将按其应有的方式进行更新。

问题:为什么不能传递整个对象?传递整个对象(而不是所有属性)的效率要高得多。

很抱歉提出这个冗长的问题,谢谢你的回答。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 19:55:09

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

下面是发生的情况:

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

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

任务完成后,如下所示:

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

票数 6
EN

Stack Overflow用户

发布于 2015-05-13 19:55:30

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

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

代码语言:javascript
运行
复制
oldMyEntity = myEntity;

您将引用更改为指向另一个对象,而前面的引用将丢失-因此您永远不会更改任何值,也不会保存任何更改的值。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30223895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档