【问题标题】:Entity Framework 4 - How is ObjectContext.Refresh() supposed to work?实体框架 4 - ObjectContext.Refresh() 应该如何工作?
【发布时间】:2012-01-02 12:02:52
【问题描述】:

当我在上下文中的实体上使用 RefreshMode.StoreWins 调用 Refresh 并且数据库中的值与实体当前持有的值不同时,我的实体是否应该将当前值更新为数据库的值,即使我的对象实体状态不变?

当编辑一个实体时,我们实例化一个新的上下文并实例化一个新的ourClass(classId),它从数据库中加载我们类类型的当前实体。对 ourClass 进行更改并正确调用 SaveChanges 会将值保存到数据库中。返回到调用视图模型后,我们使用 RefreshMode.StoreWins 在预先存在的上下文上调用 Refresh 但这并没有更新此上下文中实体的值,尽管看到数据库中的值已使用 SSMS 正确更新。我应该考虑什么来解决这个问题?

编辑: 我们如何做事的简单示例:

var context1 = new Model1();
LoadContext(); //loads all the data from the database and adds them to the context
var context2 = new Model1();
var SelectedObject = context1.Table1.First();
OurObject selectedObjectForEdit = new OurObject(SelectedObject.ObjectId);
context2.Table1.Add(selectedObjectForEdit);
selectedObjectForEdit.Name = "new name";
context2.SaveChanges();
context1.Refresh(RefreshMode.StoreWins, SelectedObject);

【问题讨论】:

    标签: c# entity-framework-4 objectcontext


    【解决方案1】:

    您必须注意上下文刷新自身上下文中的实体而不是其他上下文,手动刷新具有其他上下文的实体没有任何异常并且没有任何变化甚至在使用 SoreWins 时也会发生。

    var context1 = new Model1();
    var context2 = new Model1();
    context1.Table1.First().Caption = "a";
    var entity = context2.Table1.First();
    context1.SaveChanges();
    //below code run without exception but any change not affected
    context1.Refresh(RefreshMode.StoreWins, entity);
    

    context1 强制刷新 context2 中包含的实体。

    【讨论】:

    • 你的回答让我有点困惑。您是说 StoreWins 只更新处于 EntityState.Modified 状态的实体?
    • 我的意图是你不应该用另一个上下文刷新实体,我添加一个示例,等等...
    • 我们调用 context1.Refresh(RefreshMode.StoreWins, originalEntity) 不使用 context2 中的实体。第二个上下文和第二个实体在我们的 DetailViewModel 中生死存亡,而我们的原始实体和上下文在我们的 ListViewModel 中持续存在。更改发生在 DetailViewModel 中,我想知道当实体始终保留在 EntityState.Unchanged 中时是否可以刷新原始上下文。因此,我们不是使用附加到第二个上下文的实体调用 context1.Refresh,而是使用附加到第一个上下文的原始实体。
    • 调试 Refresh 行代码并查看 IntelliTrace 在调用 Refresh 时是否执行任何查询。你的场景通常不应该有问题!
    • 在调用 Refresh 时是否执行任何查询?问题出在哪里?
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多