2012-03-20 9 views
0

私はWebアプリケーションでEF4を使用しています。EF4 - Sprocはデータを更新しますが、データはEFで更新されません

私のデータアクセスにLINQ to EFを使用している時間の99%ですが、コールの1つはsprocである必要があります。

object[] params = { new SqlParameter("SomeId", someId), 
        new SqlParameter("OtherId", otherId)}; 
db.Database.ExecuteSqlCommand("dbo.spMySproc @SomeId, @OtherId", parms); 
db.SaveChanges(); 

sprocが起動し、データが更新されます。ただし、EFのデータが更新されない場合。私はこれがexpected behaviorであることを知りました。私もlearnedを持っていますが、.RefreshメソッドがObjectContextにありますが、私のデータベースエンティティオブジェクトはこれを持たないDbContextから継承しています。

このsprocを実行した後、EF4データベースを更新する方法はありますか? DbContextのため

答えて

1

ケーシーは、多かれ少なかれ正しいですが、あなたはそれを彼が示す道にアクセスすることはできません。あなたはDbContextをIObjectContextAdapterにキャストしてから、そこからObjectContextにアクセスできます。

var oc = myContext as IObjectContextAdapter; 
if (oc != null)  
    oc.ObjectContext.Refresh() 

しかし、おそらくこれは正しいことではありません。私はあなたの問題は、あなたのアプリケーションで単一のDbContextを使用していると思う。 DbContextは、単一の操作を実行するように設計されてから、破棄されます。あなたは、そこで終わったときに、それをdestorying ...

using(var db = new MyDbContext()) { 
    object[] params = { new SqlParameter("SomeId", someId), 
       new SqlParameter("OtherId", otherId)}; 
    db.Database.ExecuteSqlCommand("dbo.spMySproc @SomeId, @OtherId", parms); 
    //db.SaveChanges(); - This is irrelevant 
} 
+0

私の質問に答えてくれてありがとう、本当にありがとう、本当の問題を解決してくれてありがとう –

1

ドキュメントは、次のように述べている:

「DbContextは、ObjectContextはをラップし、簡略化し、より直感的なAPIを使用してのObjectContextの最も一般的に使用される機能を公開していますが、基礎となるのObjectContextにアクセスすることができますあなたがいる機能を使用する必要がある時はいつでも。詳細については、「サポートされていないもの」を参照してください。あなたのような何かができると信じて私をリード

DbContext.ObjectContext.Refresh(RefreshMode, Obj) 
+0

ないそれほど簡単.. –

+0

@MystereMan、「何か」、操作ごとに新しいDbContextを作成する必要があります。 :) –

関連する問題