我在一个项目中使用LINQ to Entity,我从中拉出一堆数据(从数据库中)并将其组织成一堆对象并将它们保存到数据库中。在使用LINQ to Entity之前,我没有遇到过写入db的问题,但是我遇到了这个特殊问题。这是我得到的错误(这是“InnerException”,异常本身没用!):
不允许新交易,因为 还有其他线程在运行 会话。
之前,当我尝试将更改保存在循环中时,我已经看到过。在这种情况下,循环结束,它尝试进行该调用,只是为了给我一个例外。这是当前的代码:
try
{
//finalResult is a list of the keys to match on for the records being pulled
foreach (int i in finalResult)
{
var queryEff = (from eff in dbMRI.MemberEligibility
where eff.Member_Key == i && eff.EffDate >= DateTime.Now
select eff.EffDate).Min();
if (queryEff != null)
{
//Add a record to the Process table
Process prRecord = new Process();
prRecord.GroupData = qa;
prRecord.Member_Key = i;
prRecord.ProcessDate = DateTime.Now;
prRecord.RecordType = "F";
prRecord.UsernameMarkedBy = "Autocard";
prRecord.GroupsId = qa.GroupsID;
prRecord.Quantity = 2;
prRecord.EffectiveDate = queryEff;
dbMRI.AddObject("Process", prRecord);
}
}
dbMRI.SaveChanges(); //<-- Crashes here
foreach (int i in finalResult)
{
var queryProc = from pro in dbMRI.Process
where pro.Member_Key == i && pro.UsernameMarkedBy == "Autocard"
select pro;
foreach (var qp in queryProc)
{
Audit aud = new Audit();
aud.Member_Key = i;
aud.ProcessId = qp.ProcessId;
aud.MarkDate = DateTime.Now;
aud.MarkedByUsername = "Autocard";
aud.GroupData = qa;
dbMRI.AddObject("Audit", aud);
}
}
dbMRI.SaveChanges(); //<-- AND here (if the first one is commented out)
}
catch (Exception e)
{
//Do Something here
}
基本上,我需要它来插入一条记录,获取该插入记录的标识,并将记录插入到具有第一条记录中的标识的另一个表中。鉴于其他一些限制因素,不可能在两者之间建立FK关系(我已尝试过,但应用程序的某些其他部分将不允许它,而我的DBA团队出于任何原因讨厌FK,但那是为了不同的主题:))
任何可能导致此问题的想法?
谢谢!
编辑:感谢更新标签!
答案 0 :(得分:10)
你的问题是你在某个地方有一个开放的阅读器。解决方案是确保您在调用SaveChanges()时选择了数据并且没有枚举查询。
我的猜测是finalResult是可查询的(所以添加一个ToList(),ToArray()等),或者你发送给我们的块位于一个更大的块中,该块在linq查询中枚举。