【发布时间】: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