2016-08-15 23 views
0

これは実際には奇妙です。私は、エンティティを見つけ、そのエンティティのフィールドを変更し、データベースに変更をコミットしようとしている、シンプルなものにしようとしている:Entity Frameworkはデータベースへの変更をコミットしません

using (AppDbContext context = new AppDbContext()) { 
    try { 
     var member = context.Members.SingleOrDefault(m = m.MembershipNumberId == membershipNo); 
     var centre = context.Centres.SingleOrDefault(c => c.CentreId == oldCentreId); 

     if (member != null) { 
      if (centre != null) { 
       member.Centre_id = Centre.id; 
       context.SaveChanges(); 
      }      
     } 
    } catch (Exception e) { 
     HandleError(e); 
    } 
} 

だから、単純明快なものを。ただし、何らかの理由でデータベースに変更がコミットされておらず、実際にはEntityStateが残りますModifiedです。

ここで私の見解では本当に奇妙なことが起こります:私はAppDbContext.SaveChanges()にブレークポイントを入れて、デバッグでchangetrackerを見ることができました。

私はこれを行うと、すべては私がUnchanged状態で私のCentreエンティティを参照してください、と私はModified状態で私のMemberエンティティを参照して、よさそうです。ウォッチウィンドウのChangeTrackerにあるMemberエンティティを開くと、何らかの理由でこれが再開するとコードが機能し、それに応じてデータベースが更新されます。

ストーリーが短いので、SaveChangesはデータベースに変更をコミットしません。しかし、私が変更を保存する際にブレークポイントを置くと、ウォッチウィンドウのチェンジトラッカーを見てから、変更されたエンティティ(私の例ではMember)を開いてから再開するだけです。

したがって、ウォッチウィンドウ内のチェンジトラッカーのコードが動作するエンティティを見ると、何が起きる可能性がありますか?私はここで敗北しており、どんな助けにも大いに感謝しています。前もって感謝します。

+0

それがすべてで重要ならば、私はただ、これはコントローラのアクションの中にあることを追加する必要があります。 – Dean

+0

'member'と' centre'はどちらも 'null'ではありませんか? –

+1

これを 'savechnages'行の前に追加してください。 'context.Entry(メンバ).State = EntityState.Modified;' – Mairaj

答えて

0

私はそれが何かを考え出しました。メンバーPOCOはそれで次のフィールドを持っていた:

[必須] パブリック仮想アカウント

Aは怠惰なロードされたフィールドを必要としていました。ウォッチウィンドウでエンティティを開いたときにアカウントがないと思ったので、検証エラーが出ていましたが、Lazyの読み込みが強制され、アカウントがロードされました。私は[必須]をオフにして、今は動作しています。私が最初に検証エラーを見ていなかった理由を動作するように今

:/

関連する問題