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

时间:2010-04-02 19:04:28

标签: .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
}

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

任何可能导致此问题的想法?

谢谢!

编辑:感谢更新标签!

1 个答案:

答案 0 :(得分:10)

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

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