【问题标题】:Why doesn't updating a reference update the object?为什么更新引用不更新对象?
【发布时间】:2015-07-25 06:37:52
【问题描述】:

我有一个使用实体框架存储库模式的项目来管理数据库中的对象。我想知道为什么不通过传递新对象的引用来更新对象。 (问题可能有点不准确,但你会得到带有代码的图片)
我的更新方法如下:

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();
}

对象已按应有的方式更新。
问题:为什么不能传递整个对象?传递整个对象而不是一个一个传递所有属性会更有效。
抱歉,问题很冗长,感谢您的回答。

【问题讨论】:

  • oldMyEntity 只是一个变量,而不是对从数据上下文返回的对象的永久束缚。奇怪的是,为什么您会认为覆盖整个变量的行为会有所不同。是什么让您得出最初的结论?
  • 为什么更新引用更新对象?如果您将黄页中列出的地址从 123 Fake St. 编辑到 987 Other Ln,这是否意味着 123 Fake St. 的房子被取走并搬到了 987 Other Ln。自动地?将地址编辑为另一个地址不会影响任一地址引用的对象。
  • 我明白了,但现在我很困惑。那为什么后面的代码示例会更新对象呢?
  • 关于 EF 特定的问题,您可能想要在这里做的是通过其键 Attach 您的“myEntity”对象,以便 EF 可以检测到更改并保存它们。具体如何执行此操作取决于上下文的生命周期以及“myEntity”的来源,但这可能会为您指明正确的方向。
  • @Servy 我现在得到这个了吗,以你以前的房子为例:如果我声明一个var House = aLittleRedCottage 然后House = aCottageNextToTheRedOne 我将变量的引用更改为另一个房子和红色小屋保持原样。而是House.DoorKnob = aCottageNextToTheRedOne.DoorKnob 会改变小红屋的门把手以匹配另一个?

标签: c# entity-framework oop crud


【解决方案1】:

在您的第一个代码 sn-p 中发生的不是按引用对象的更新,而是对对象的引用的更新,而对象本身保持不变。

会发生什么:

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

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

赋值后是这样的:

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

【讨论】:

    【解决方案2】:

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

    oldMyEntity 是对对象的引用 - 当您进行分配时

    oldMyEntity = myEntity;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      相关资源
      最近更新 更多