3

Я получаю исключение:Удаление рамки записи сущности

Невозможно обновить «Session» в EntitySet, потому что она имеет 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

Есть ли в таблице Session первичный ключ? –

+0

@Klaus Byskov Hoffmann: К сожалению, у него нет первичного ключа – 14578446

ответ

1

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

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

+0

У меня есть несколько кулонов в моей таблице, подходящих для ПК, и я вижу, что они отмечены как сущность-ключ в дизайнере. User_id является одним из этих столбцов, но я не могу делить записи и m получать вышеупомянутое исключение. – 14578446

1

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

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

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

Смежные вопросы