我正在使用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();
}
请帮助。!!! 在此先感谢。!!!
答案 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();
}