LINQ(实体)的问题[添加记录]

Sla*_*der 2 .net entity-framework .net-3.5

我在一个项目中使用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
}
Run Code Online (Sandbox Code Playgroud)

基本上,我需要它来插入一条记录,获取该插入记录的标识,并将记录插入到具有第一条记录中的标识的另一个表中.鉴于其他一些限制因素,不可能在两者之间建立FK关系(我已尝试过,但应用程序的某些其他部分将不允许它,而我的DBA团队出于任何原因讨厌FK,但那是为了不同主题:))

可能导致这种情况的任何想法?

谢谢!

编辑:感谢更新标签!

Nix*_*Nix 10

你的问题是你在某个地方有一个开放的阅读器.解决方案是确保在调用SaveChanges()时选择了数据并且没有枚举查询.

我的猜测是finalResult是可查询的(所以添加一个ToList(),ToArray()等),或者你发送给我们的块是在linq查询中枚举的更大块内.

  • 这样做了.我无法相信我没有看到"父"foreach循环.显然使父查询成为.ToList()并遍历列表而不是查询本身有帮助:)谢谢.我需要向正确的方向努力才能找到这个! (2认同)