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

Sam*_*ami 1 c# oop entity-framework crud

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

public void UpdateMyEntity(MyEntity myEntity)
{
    MyEntity oldMyEntity = context.MyEntities.Where(m => m.Id == myEntity.Id).FirstOrDefault();
    oldMyEntity = myEntity;
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

现在我已经检查过oldMyEntity更新的属性以匹配那些myEntity,所以我可以假设数据库中的对象得到更新.出于某种原因,情况并非如此.如果我将代码更改为以下内容:

public void UpdateMyEntity(MyEntity myEntity)
{
    MyEntity oldMyEntity = context.MyEntities.Where(m => m.Id == myEntity.Id).FirstOrDefault();
    oldMyEntity.MyProperty = myEntity.MyProperty;
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

对象按原样更新.
问题:为什么不传递整个对象?传递整个对象而不是一个接一个地传递所有属性会更有效.
对不起,请提出详细的问题并感谢您的回答.

das*_*ght 5

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

这是发生的事情:

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

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

在分配之前

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

任务完成后

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

分配属性