2017-06-09 14 views
0

データベース(Entity Framework、コードファースト)に接続されている単純なアプリケーションがあります。私は、データベースへのエントリを更新するために使用される画面を持っています。私は、次のコードでデータベースを更新することができる午前:私はすぐにSaveChangesメソッドを呼び出した後、データベースを更新する場合は、私が実際のデータベースの変更を見ることができますDbContextにEntity Frameworkデータベースの変更がありません

public void UpdatePlayer() 
{ 
    Player playerInDb = GetPlayerFromDb(_player.Id); 

    playerInDb.Name = Name; 
    playerInDb.Score = Score; 

    _context.SaveChanges(); 
    TryClose(); 
} 

private Player GetPlayerFromDb(int id) 
{ 
    return _context.Players.Single(p => p.Id == id); 
} 

、私は_context.Playersを見れば、古いです値はまだそこにあります。私は、アプリケーションを閉じてからDbContextに変更が反映された後でなければなりません。 SaveChangesを呼び出した後、データベースから更新されたデータがDbContextに表示されることを確認するにはどうすればよいですか?

UPDATE:私は次のように私のコードを変更した

public void UpdatePlayer() 
    { 
     Player playerInDb = GetPlayerFromDb(_player.Id); 

     playerInDb.Name = Name; 
     playerInDb.Score = Score; 

     using (var context = new ApplicationDbContext()) 
     { 
      context.Players.Attach(playerInDb); 
      context.Entry(playerInDb).State = EntityState.Modified; 
      context.SaveChanges(); 
     } 
     TryClose(); 
    } 

私はまだ同じ問題を持っています。レコードはdbでは更新されますが、アプリケーションでは更新されないため、新しいデータでUIが更新されません。たとえ私がデータベースからプレーヤーのコレクション全体をリロードしても、アプリケーションを完全に再起動するまで何も更新されません。

+0

2つの呼び出しの間にコンテキストを開いたままにしている可能性があります。 'using'ステートメントか、もっと良いIoCコンテナーを試してみてください。 https://stackoverflow.com/questions/28042161/ef-returns-old-values –

+0

「どのように_context.Playersを見ますか」 – Evk

+0

あなたは試してみることができます。Find() – hasan

答えて

0

あなたは、オブジェクトを変更するために余分なステップが必要になります。

_context.Players.Attach(playerInDb); 

var entry = _context.Entry(playerInDb); 
entry.State = EntityState.Modified; 

_context.SaveChanges(); 

また、あなたがより多くの詳細については、これらを確認する必要があります。
- https://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx
- Entity Framework 5 Updating a Record
- How to update record using Entity Framework 6?

0

エンティティ選択自体が2回以上行われた場合のスピード時間を増加させるためにエンティティをキャッシュするメカニズムを持っています。設定することでエンティティの状態を変更することができます。

entity.State = EntityState.Modified; 

ではなく、クラス内の同じdbContextを共有するよりも、仕事の概念の単位を使用することを検討してください。これは、この構文を使用して、コンテキスト自体を配置します:あなたはコンテキストを処分 `tの場合

using(DbContext dbContext = new DbContext()) 
{ 
    //Do some stuff, update, delete etc 
} 

は適切にあなたにもアプリケーションのための他の問題を引き起こしてしまいます。

関連する問題