Entity framework 4 使用DbContext刷新实体实例

Entity framework 4 使用DbContext刷新实体实例,entity-framework-4,entity-framework-ctp5,ef-code-first,Entity Framework 4,Entity Framework Ctp5,Ef Code First,对于EF4 CTP5 DbContext,它的等价物是什么 public void Refresh(Document instance) { _ctx.Refresh(RefreshMode.StoreWins, instance); } 我已经尝试过了,但它没有做同样的事情,更新实例 public void Refresh(Document instance) { _ctx.ChangeTracker.DetectCha

对于EF4 CTP5 DbContext,它的等价物是什么

    public void Refresh(Document instance)
    {
        _ctx.Refresh(RefreshMode.StoreWins, instance);
    }
我已经尝试过了,但它没有做同样的事情,更新实例

    public void Refresh(Document instance)
    {
        _ctx.ChangeTracker.DetectChanges();
    }

您必须使用:

public void Refresh(Document instance)
{
  _ctx.Entry<Document>(instance).Reload();
}
公共作废刷新(文档实例)
{
_Entry(instance.Reload();
}

上述方法不起作用。Reload()方法无法从数据库中正确刷新实体。它执行SQL select查询,但不为导航属性生成代理。请参见下面的示例(我使用SQL Server中的Northwind数据库和EF 5.1):

NorthwindEntities NorthwindEntities=新的NorthwindEntities();
产品新产品=新产品
{
ProductName=“新产品”,
中止=错误,
类别ID=3
};
northwindEntities.Products.Add(新产品);
northwindEntities.SaveChanges();
//现在,产品存储在数据库中。让我们打印它的类别
Console.WriteLine(newProduct.Category);//打印“null”->未加载导航属性
//按主键查找产品-->返回相同的对象(未修改)
//仍然打印“null”(由于缓存和身份解析)
var productByPK=northwindEntities.Products.Find(newProduct.ProductID);
Console.WriteLine(productByPK.Category);//null(由于缓存)
//从数据库重新加载实体没有帮助!
条目(newProduct.Reload();
Console.WriteLine(newProduct.Category);//null(重新加载没有帮助)
//从上下文中分离对象
((IObjectContextAdapter)northwindEntities.ObjectContext.Detach(newProduct);
//现在按主键查找产品(分离的实体不缓存)
var detachedProductByPK=northwindEntities.Products.Find(newProduct.ProductID);
Console.WriteLine(detachedProductByPK.Category);//工作(无缓存)
我可以得出结论,EF实体的真正刷新/重新加载可以通过分离+查找来完成:

((IObjectContextAdapter)context).ObjectContext.Detach(entity);
entity = context.<SomeEntitySet>.Find(entity.PrimaryKey);
((IObjectContextAdapter)上下文).ObjectContext.Detach(实体);
entity=context..Find(entity.PrimaryKey);

Nakov

我发现在具有导航属性的代理实体上重新加载失败

作为解决方法,重置当前值,然后按如下方式重新加载:

var entry =_ctx.Entry<Document>(instance);
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload();
var entry=\u ctx.entry(实例);
entry.CurrentValues.SetValues(entry.OriginalValues);
entry.Reload();

从@Dimitar Dimitrov:
的NAA中,您使用POCO类的构造函数来创建新的产品对象,因此它不会成为代理。您应该使用DbSet.Create方法来获取代理。当您从上下文中分离实体并使用Find方法从数据库中加载它时,entity Framework将为该实体创建一个代理。这就是为什么它与Detach+Find一起工作。但是,DbEntityEntry.Reload方法不会刷新实体的关系。
@bummi感谢您发布该报价。使用DbSet.Create而不仅仅是“new”来初始化我的实体,可以在保存更改和重新加载实体后使导航属性正常工作。非常感谢。这对我有用。在EF之外修改数据时,重新加载也不起作用。奇怪的行为:删除子实体并将其重新添加到父实体后。。。我刷新的父实体现在有2个子实体,而不是1个子实体。。。由于某些原因,已删除的子实体仍然存在。我尝试了创建、添加、保存和重新加载方法,但我的变量仍然没有新实体的数据库Id。这怎么会如此困难?不起作用。关系不会重置为原始值。
var entry =_ctx.Entry<Document>(instance);
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload();