2011-07-04 2 views
0

のは、私はこのコードを持っているとしましょう:Enityフレームワーク4.1 - 1回の旅行データベースの更新

class Score 
{ 
    public Update(int score) 
    { 
     update score but do not call (context.SaveChanges()) 
    } 
} 

class Foo 
{ 
    public DoSomething(int update) 
    { 
      Score score = new Score(); 
      score.Update(2); 
      SomeObj obj = (select object); 
      obj.Soo = 3; 
      context.SaveChanges(); 
     } 
} 

は、基本的にはそれを動作させるために、私は明示的にメソッドUpdateでのSaveChangesを提供する必要があります。しかし、私は4つのメソッドが並んでいて、34243人のユーザーがデータを更新したいと思っていますが、4つの旅行でそれぞれ1つのセーブを保存することはお勧めできません。

EF4.1では、最後の瞬間にデータベースの更新を遅らせる方法がありますか?または、各メソッドの明示的な保存を余儀なくされていますか?

編集: 説明のため。私は外部メソッドでSaveChangesを呼び出さないようにしましたが、変更が保存される場所は1回だけでした。

私は、実際の例を与える:

public class ScoreService : IScoreService 
{ 
private JamiContext _ctx; 
    private IRepository<User> _usrRepo; 
    public ScoreService(IRepository<User> usrRepo) 
    { 
     _ctx = new JamiContext(); 
     _usrRepo = usrRepo; 
    } 

    public void PostScore(int userId, GlobalSettings gs, string name) 
    { 
     User user = _ctx.UserSet.Where(x => x.Id == userId).FirstOrDefault(); 
     if (name == "up") 
     { 
      user.Rating = user.Rating + gs.ScoreForLike; 
     } 
     else if (name == "down") 
     { 
      user.Rating = user.Rating - Math.Abs(gs.ScoreForDislike); 
     } 
    } 
} 

そして今:

public PostRating LikeDislike(User user, int postId, int userId, GlobalSettings set, string name) 
    { 
     PostRating model = new PostRating(); 
     var post = (from p in _ctx.PostSet 
        where p.Id == postId 
        select p).FirstOrDefault(); 
     if (name == "up") 
     { 
      post.Like = post.Like + 1; 
      model.Rating = post.Like - post.Dislike; 
     } 
     else if (name == "down") 
     { 
      post.Dislike = post.Dislike + 1; 
      model.Rating = post.Like - post.Dislike; 
     } 

     PostVote pv = new PostVote(); 
     pv.PostId = post.Id; 
     pv.UserId = user.Id; 
     _ctx.PostVoteSet.Add(pv); 
     _scoreSrv.PostScore(userId, set, name); 
     _ctx.SaveChanges(); 

     return model; 
    } 

を私は道にPostScore

+1

アップデートを延期したい場合なぜあなたはUpdateメソッドで 'SaveChanges'を呼び出しますか?あなたの例は非常に不明です。 –

+0

なぜ私は 'context.saveChanges())を呼び出さない'と書いたのですか?( –

答えて

1

例では、PostScoreLikeDislikeは異なるコンテキストインスタンスを使用しています。それはあなたの問題の原因であり、その場合は複数のSaveChangesを呼び出すことを避ける方法はありません。全体の操作は単一の作業単位であり、そのために単一のコンテキスト・インスタンスを使用する必要があります。この場合、複数のコンテキストインスタンスを使用するのは間違った設計です。

SaveChangesと呼んでも、EFはコマンドバッチ処理をサポートしていないため、更新、挿入、削除された各エンティティごとにデータベースへのラウンドトリップが行われます。

0

でSaveChangesメソッドを呼び出すまで、私は、この場合の利用者の評価は、更新されません。最後の瞬間までのデータベース更新の遅延は、最後の瞬間までSaveChangesを呼び出さないことによる。

あなたはこのコードを完全に制御できます。また、コードが毎回更新後にSaveChangesを呼び出す場合は、変更する必要があります。

0

これは本当に私の全体の問題を解決していないが、少なくとも私は、コンテキストの単一のインスタンスを使用することができます。Ninjectで :

Bind<JamiContext>().To<JamiContext>().InRequestScope(); 

そしてコンストラクタ:

private JamiContext _ctx; 
    private IRepository<User> _usrRepo; 
    public ScoreService(IRepository<User> usrRepo, JamiContext ctx) 
    { 
     _ctx = ctx; 
     _usrRepo = usrRepo; 
    } 
+0

)コンテキストはシングルトン、静的、共有であってはならないので、コンテキストは単一の論理操作に使用する必要があります:http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392(コンテキストはスレッドセーフではありません) –

+0

So私はむしろ.InRequestScope()を使用する必要がありますか? –

+0

Webアプリケーション –

関連する問題