代码之家  ›  专栏  ›  技术社区  ›  SlackerCoder

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

  •  2
  • SlackerCoder  · 技术社区  · 15 年前

    我在一个项目中使用linq to实体,在这个项目中,我从数据库中提取一组数据,并将其组织成一组对象,然后将它们保存到数据库中。在使用linq to实体之前,我没有遇到向数据库写入数据的问题,但是我遇到了这个特殊的问题。这是我得到的错误(这是“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 回复  |  直到 14 年前
        1
  •  10
  •   Nix    15 年前

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

    我的猜测是最终结果是可查询的(所以添加tolist()、toarray()等),或者您发送给我们的块位于一个更大的块中,该块正在对Linq查询进行枚举。