0

こんにちは、Linq とエンティティ フレームワークを使用して、ID に基づいて基本的な更新をしようとしています。私はこれに非常に慣れていませんが、問題はわかりません。

私のエンティティ クラス オブジェクトは、コントローラ レベルで宣言されています。

gwwbnEntities db = new gwwbnEntities();

メソッドはクエリ文字列 ID を取得し、その ID で表されるユーザーの登録ステータスを更新します。

public ActionResult ConfirmedAccount(int id)
    {

        var q = from u in db.user_registration
                where u.id == id && u.reg_status == null
                select u;

        if (q.Any())
        {
            foreach(var item in q){

            user_registration user = item;
            user.reg_status = 202;
            db.Entry(user).State = EntityState.Modified;
            db.SaveChanges();
            }

            return View();
        }
        else
        {
            return RedirectToAction("RegistrationError");
        }
    }

どんな助けでも大歓迎です!ここでもすべてが機能し、正しく入力されますが、コンテキスト object.SaveChanges() メソッドは毎回失敗します。

みんなありがとう!

4

1 に答える 1

3

表示されている例外は、開いているデータ リーダー (foreach) があり、SaveChanges() でトランザクションを作成しようとしているためです (EF が作成します)。ループの外で SaveChanges を呼び出します。さらに、状態を Modified に設定しないでください。EF は、プロパティが変更されたことを検出し、それに応じて状態を自動的に設定します。何かを行う前に、 q で .ToList() を実行したい場合があります。現時点では、データベースへのクエリを送信しています (1 つは .Any() 用、もう 1 つはエンティティを取得するため)。.ToList() を実行すると、エンティティを取得する 1 つのクエリのみが送信されますが、.Any() はデータベースではなくリストで呼び出されるため、はるかに高速になり、データベースへのトリップはありません。また、 ToList() はクエリの評価を強制するため、foreach ループはリストを反復するため、データ リーダーを開いたままにしないでください。

于 2012-05-04T21:12:25.730 に答える