不允许新事务,因为在会话Linq to Entity Mvc C#中运行其他线程

时间:2012-09-08 08:05:48

标签: c# asp.net asp.net-mvc-3 entity-framework linq-to-entities

我正在使用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();
}

请帮助。!!! 在此先感谢。!!!

2 个答案:

答案 0 :(得分:3)

在我的例子中,在嵌套循环中不经常调用SaveChanges()可以解决问题:

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

这是我的解决方案

//does not produce error
foreach(...) {
    foreach(...) {
       ...
    }
}
db.SaveChanges();

答案 1 :(得分:1)

在这个不错的Blog中找到了一个非常好的解决方案。

解决我的问题: -

 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();
                }