Удалить структуру записи объекта - PullRequest
3 голосов
/ 18 января 2012

Я получаю исключение:

Невозможно обновить EntitySet 'Session', поскольку у него есть DefiningQuery и нет элемент существует в элементе поддерживать текущую операцию.

при попытке удалить строку из таблицы базы данных. Исключение появляется при вызове SaveChanges() для строки, которая существует. Ниже мой код:

public static Func<DC21GPDEntities, string, IQueryable<Session>> compiledDeleteQuery =
    CompiledQuery.Compile((DC21GPDEntities ctx, string userId) =>
        (from rows in ctx.Sessions
         where rows.User_ID == userId
         select rows));

[HttpPost]
public ActionResult Index(string searchItem )
{
   try
   {
      string userId =searchItem.Trim();
      string successMessage 
                = "The session for User ID: " + userId + " has been cleared in Fascor.";

      dc21gpdContext.CommandTimeout = 180;

      Models.Session session = Queries.compiledDeleteQuery(dc21gpdContext, userId).FirstOrDefault();

      if (session == null)
          successMessage = "Session for User ID: " + userId + " does noe exist";
      else
      {
          dc21gpdContext.DeleteObject(session);
          dc21gpdContext.SaveChanges();
      }

      ViewData["SuccessMessage"] = successMessage;
      return View();
  }
  catch (Exception ex)
  {
     ViewData["SuccessMessage"] = "Failed to clear session";
     return View();
  }
}

Ответы [ 2 ]

1 голос
/ 18 января 2012

Если ваша таблица Session не имеет первичного ключа, она отображается как DefiningQuery, что делает ее доступной только для чтения.Вы не можете удалять, вставлять или обновлять записи, сопоставленные с DefinedQuery, если вы не создадите хранимые процедуры, определяющие эти операции, и сопоставите их в модели.

Даже после этого этого не должно быть достаточно.Объекты удаляются их ключом.Вы можете определить ключ в своей модели сущности, но ключ должен однозначно идентифицировать запись.По умолчанию EF будет использовать все необнуляемые, недвоичные столбцы в качестве ключа.Если этот набор столбцов не идентифицирует записи однозначно, у вас будет больше проблем с использованием сущности Session (например, операция удаления приведет к удалению более одной записи, а SaveChanges не удастся выполнить) - в этом случае единственным вариантом является добавлениеуникальный столбец таблицы и использовать его в качестве ключа.Как только вы добавите PK в таблицу, все эти проблемы будут решены.

1 голос
/ 18 января 2012

В сообщении говорится, в чем проблема, просто не очень хорошо.Я попытаюсь уточнить.

Entity Framework по умолчанию генерирует запросы на выборку объектов.Ваш EntityContainer для объекта «Session» имеет явный запрос, означающий, что вам, EntityFramework, приказано использовать определенный кусок рукописного sql (или хранимого процесса) для выборки Sessions.

Когда вы переопределяете это поведение, вы также должны предоставить запрос, который сообщит ему, как удалить сеанс. Вот документация о том, как добавить такую ​​функцию удаления в ваш контейнер Entity Framework.

...