1

Databasecontext に問題がある .Net Mvc プロジェクトがあります。update/saveChanges でより具体的に。メソッド(以下)にデバッグポイントを付けてコードをデバッグしているとき、動作するように見えますが、デバッグポイントがないわけではありません。なぜだか理解できない?どういうわけか、SaveChanges はエンティティへの変更を検出しません。

var user = DatabaseContext.Users.Single(u => u.Id == userId && u.Newsdesk.Id == newsdeskId);
user.Newsdesk = null;
DatabaseContext.Update(user);
DatabaseContext.SaveChanges();

DatabaseContext の更新メソッドは次のようになります。

public T Update<T>(T entity) where T : class
    {
        var set = Set<T>().Attach(entity);
        Entry(entity).State = EntityState.Modified;
        return set;
    }

誰かが私を正しい方向に向けることができれば、私はとても感謝しています

4

1 に答える 1

2

すぐに出入りします(ガンダルフが映画の1つで言ったことです... :)私は思います)。

つまり、敬虔なオブザーバーがCPU内に座ってアプリを見ている場合、彼らが見るべきことは、アプリが次のシーケンスを実行しているということです。

{接続、コンテキストの作成、変更、コミット、コンテキストの破棄、切断}

(ほぼ)受信する各Web要求に対して数十ミリ秒で。

アプリ全体にグローバルに存在するコンテキスト(エンティティコンテナ+作業単位)を実際に作成していますか?

私は、より古典的であまりdbconnectionに適さないアプローチをお勧めします(トランザクション的にサニタイズされることは言うまでもありません):

using (var context = DataContextHelper.CreateContext()) {
    var user = DataContextHelper.QueryAndSingleByLambdaBasedOnContext(
        context,
        u => u.Id == userId && u.Newsdesk.Id == newsdeskId
    );
    if (null == user)
       // complain somehow (by exception or special return value)
    user.Newsdesk = null;

    // don't mark it anymore, in the straight-forward, good'ol way
    // user will already have been marked 
    //DatabaseContext.Update(user);

    context.SaveChanges();
}

複数のスレッドが同時に使用できる、グローバルにアクセス可能なコンテキストを何らかの形でホストすることは、一般的に悪いことです(特に注意しない場合)。

一部のプロパティにアクセスする際の同時実行の危険性については話していません。私は全体像について話している(多分別のリクエストがユーザーを読んで、あなたUpdateとの間のどこかで「変更されていない」とマークしたSaveChanges)。

そうでない場合は、データベースへの同時接続について心配する必要はありません。コンテキストへの同時アクセスは、管理がはるかに困難です。

于 2013-03-01T14:47:00.117 に答える