Удалить структуру сущности записи

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

Невозможно обновить 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();
  }
}

person 14578446    schedule 17.01.2012    source источник
comment
Есть ли в таблице Session первичный ключ?   -  person Klaus Byskov Pedersen    schedule 18.01.2012
comment
@Клаус Бысков Хоффманн: к сожалению, у него нет первичного ключа   -  person 14578446    schedule 18.01.2012


Ответы (2)


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

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

person Ladislav Mrnka    schedule 18.01.2012
comment
У меня есть несколько столбцов в моей таблице, соответствующих PK, и я вижу, что они помечены как ключ объекта в дизайнере. User_id является одним из этих столбцов, но я не могу удалить записи и получаю указанное выше исключение. - person 14578446; 18.01.2012

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

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

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

person Tim Hoolihan    schedule 17.01.2012