Проблемы с LINQ (для Entity) [добавление записей] - PullRequest
2 голосов
/ 02 апреля 2010

Я использую LINQ to Entity в проекте, где я извлекаю кучу данных (из базы данных), объединяю их в кучу объектов и сохраняю их в базе данных. У меня не было проблем с записью в БД перед использованием LINQ to Entity, но я столкнулся с этой проблемой. Вот ошибка, которую я получаю (это «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 между ними (я пробовал, но некоторые другие части приложения не позволяют этого, И моя команда администраторов баз данных по любой причине ненавидит FK, но это для другая тема :))

Есть идеи, что может быть причиной этого?

Спасибо!

Редактировать: спасибо за обновление тегов!

1 Ответ

10 голосов
/ 04 апреля 2010

Ваша проблема в том, что у вас есть открытый Reader где-то. Решение состоит в том, чтобы убедиться, что вы выбрали свои данные и не перечислили их в запросе при вызове SaveChanges ().

Я предполагаю, что finalResult является Queryable (поэтому добавьте ToList (), ToArray () и т. Д.), Или отправленный нам блок находится внутри большего блока, который перечисляет запрос linq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...