web-dev-qa-db-ja.com

DbContextを使用してエンティティインスタンスを更新する

EF4 CTP5 DbContextでは、これと同等のものは何ですか

    public void Refresh(Document instance)
    {
        _ctx.Refresh(RefreshMode.StoreWins, instance);
    }

私はこれを試してみましたが、インスタンスを更新して同じことをしません

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

40
mare

これを使用する必要があります:

public void Refresh(Document instance)
{
  _ctx.Entry<Document>(instance).Reload();
}
56
Ladislav Mrnka

上記は機能しません。 Reload()メソッドは、データベースからエンティティを正しく更新しません。 SQL選択クエリを実行しますが、ナビゲーションプロパティのプロキシを構築しません。以下の例を参照してください(SQL ServerのEF 5.1でNorthwindデータベースを使用しています)。

NorthwindEntities northwindEntities = new NorthwindEntities();
Product newProduct = new Product
{
    ProductName = "new product",
    Discontinued = false,
    CategoryID = 3
};
northwindEntities.Products.Add(newProduct);
northwindEntities.SaveChanges();

// Now the product is stored in the database. Let's print its category

Console.WriteLine(newProduct.Category); // prints "null" -> navigational property not loaded

// Find the product by primary key --> returns the same object (unmodified)
// Still prints "null" (due to caching and identity resolution)
var productByPK = northwindEntities.Products.Find(newProduct.ProductID);
Console.WriteLine(productByPK.Category); // null (due to caching)

// Reloading the entity from the database doesn't help!
northwindEntities.Entry<Product>(newProduct).Reload();
Console.WriteLine(newProduct.Category); // null (reload doesn't help)

// Detach the object from the context
((IObjectContextAdapter)northwindEntities).ObjectContext.Detach(newProduct);

// Now find the product by primary key (detached entities are not cached)
var detachedProductByPK = northwindEntities.Products.Find(newProduct.ProductID);
Console.WriteLine(detachedProductByPK.Category); // works (no caching)

EFエンティティの実際の更新/再読み込みは、Detach + Findで実行できると結論付けることができます。

((IObjectContextAdapter)context).ObjectContext.Detach(entity);
entity = context.<SomeEntitySet>.Find(entity.PrimaryKey);

ナコフ

24
Svetlin Nakov

ナビゲーションプロパティを持つプロキシエンティティでリロードが失敗することがわかりました。

回避策として、現在の値をリセットしてから、次のようにリロードします。

var entry =_ctx.Entry<Document>(instance);
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload();
0
Matstar