删除一个记录实体框架
我收到一个例外情况:
无法更新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();
}
}
如果您的Session
表没有主键,则会DefiningQuery
其映射为使其只读的DefiningQuery
。 除非您创建定义这些操作的存储过程并将它们映射到DefinedQuery
否则无法删除,插入或更新映射到DefinedQuery
记录。
即使在这之后,它也不够。 实体被他们的密钥删除。 您可以在实体模型中定义键,但键必须唯一标识记录。 默认情况下,EF将使用所有不可为空的非二进制列作为键。 如果这组列没有唯一标识记录,那么使用Session
实体会遇到更多问题(例如,删除操作将删除多条记录,并且SaveChanges
将失败) - 在这种情况下,唯一的选择是添加一个唯一列该表并将其用作关键字。 一旦你将PK添加到表中,所有这些问题都将被解决。
消息告诉问题是什么,只是不太好。 我会尽力详细说明。
默认情况下,实体框架为获取对象生成查询。 “Session”对象的EntityContainer具有明确的查询,这意味着EntityFramework被告知使用特定的手写sql(或存储过程)来获取Sessions。
当您覆盖该行为时,您还必须提供一个查询,告诉它如何删除会话。 以下是关于如何将这种删除功能添加到实体框架容器的文档。
链接地址: http://www.djcxy.com/p/64925.html上一篇: Delete a record entity framework
下一篇: Entity Framework 4.2: InsertFunction for Tables without PK