0

Linqを使用してMVCをエンティティ化していますが、データベースからレコードを削除しようとすると、この例外が発生します。

セッションで実行されている他のスレッドがあるため、新しいトランザクションは許可されません。

私のコード:

if (Request.Form["Enroll"] != null)
{
    string[] selected = Request.Form["Enroll"].Split(',');

    if (selected != null)
    {
        if (selected.Count() != 0)
        {
            int k = 0;
            foreach (var item in selected)
            {
                var TraineeId = Convert.ToInt32(item[k].ToString());
                var sessionid = Convert.ToInt32(Session["user"].ToString());

                var id = db.EnrollTrainee.Where(i => i.TraineeID == TraineeId
                                                && i.TrainerID == sessionid);

                if (id != null)
                {
                    foreach (var a in id)
                    {
                        //db.Database.Connection.Close();
                        EnrollTrainee delete = db.EnrollTrainee.Find(a.id);
                        db.EnrollTrainee.Remove(delete);
                        db.SaveChanges();   //Getting Exception Here                                        
                    }
                }
                k++;
            }
        }
    }
    populatelistbox();
    return View();
}

助けてください。!!!前もって感謝します。!!!

4

2 に答える 2

3

私の場合、ネストされたループでSaveChanges()を呼び出す頻度を減らすと、問題が解決します。

//produces error 
foreach(...) {
    foreach(...) {
       ...
       db.SaveChanges();
    } }

これが私の解決策です

//does not produce error
foreach(...) {
    foreach(...) {
       ...
    }
}
db.SaveChanges();
于 2013-05-08T17:06:53.637 に答える
1

この素敵なブログで非常に良い解決策を得ました。

私の問題の解決策:-

 if (Request.Form["Enroll"] != null)
                {
                    string[] selected = Request.Form["Enroll"].Split(',');

                    if (selected != null)
                    {
                        if (selected.Count() != 0)
                        {
                            int k = 0;
                            foreach (var item in selected)
                            {
                                var TraineeId = Convert.ToInt32(item[k].ToString());
                                var sessionid = Convert.ToInt32(Session["user"].ToString());

                                var id = db.EnrollTrainee.Where(i => i.TraineeID == TraineeId
                                                                && i.TrainerID == sessionid);
                                var idlist = id.ToArray<EnrollTrainee>();//Added New Line

                                if (idlist != null)
                                {
                                    foreach (var a in idlist)
                                    {
                                        EnrollTrainee delete = db.EnrollTrainee.Find(a.id);
                                        db.EnrollTrainee.Remove(delete);
                                        db.SaveChanges();                                           
                                    }
                                }
                                k++;
                            }
                        }
                    }
                    populatelistbox();
                    return View();
                }
于 2012-09-08T08:18:27.063 に答える