分离T的所有实体以获取新数据

时间:2014-08-25 12:34:23

标签: wpf entity-framework data-binding

让我们举一个例子,其中有两种类型的entites:Product和Category,Product.CategoryId - > Category.Id。我们对产品(不是类别)提供CRUD操作。

如果在另一个屏幕上更新了类别(或来自网络中的其他用户),我们希望能够重新加载类别,同时保留我们当前使用的上下文,因为我们可能正在编辑数据,我们不希望丢失更改(我们不能依赖保存,因为我们的数据不完整)。

由于没有简单的方法告诉EF获取新数据(添加,删除和修改),我们考虑了两种可能的方法:

1)将产品附加到上下文,并将类别与上下文分离。这意味着我们无法访问我们有时需要的Product.Category.Name,因此我们需要手动解析它(例如打印数据时)。

2)从当前背景中分离/附加所有类别。

Context.ChangeTracker.Entries().Where(x => x.Entity.GetType() == typeof(T)).ForEach(x => x.State = EntityState.Detached);

然后重新加载类别,这将获得新数据。你觉得第二种方法有什么问题吗?我们知道这将需要将所有约束放在外键上,而不是导航属性,因为在分离所有类别时,Product.Category导航属性也将重置为null。此外,可能存在潜在的性能问题,我们没有测试,因为可能会加载几千个产品,并且在重新加载时都需要解析导航属性。

您更喜欢哪两个,并且有更好的方法(EF6 + .NET 4.0)?

2 个答案:

答案 0 :(得分:0)

听起来像是想要尝试

/// <summary>
/// Reloads the entity from the database overwriting any property values with values from the database.
///             The entity will be in the Unchanged state after calling this method.
/// 
/// </summary>
public void Reload(){
  ....
}

示例电话

     public virtual void Reload(TPoco poco) {

        if (poco == null) {
          // wtf....        
        }
        try {
            Context.Entry<TPoco>(poco).Reload();
        }
        catch (Exception ex) {
            //... whatever
            throw;
        }
    }

答案 1 :(得分:0)

您可以使用二级缓存实施,例如:

注意:它不再是测试版。在2013/8/27发布的1.0.0。还有其他实现,包括一些旧版本的EF。