【问题标题】:Delete a record entity framework删除记录实体框架
【发布时间】:2012-01-17 21:05:29
【问题描述】:

我收到一个异常:

无法更新 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表有主键吗?
  • @Klaus Byskov Hoffmann:不幸的是,它没有主键

标签: entity-framework c#-4.0 linq-to-entities asp.net-4.0 compiled-query


【解决方案1】:

如果您的Session 表没有主键,则它被映射为DefiningQuery,这使它成为只读的。您不能删除、插入或更新映射到DefinedQuery 的记录,除非您创建定义这些操作的存储过程并将它们映射到模型中。

即使在那之后,它也不一定足够。实体通过它们的键被删除。您可以在实体模型中定义键,但键必须唯一标识记录。默认情况下,EF 将使用所有不可为空的非二进制列作为键。如果这组列不能唯一标识记录,则使用Session 实体将遇到更多问题(例如,删除操作将删除多个记录,SaveChanges 将失败)-在这种情况下,唯一的选择是添加表的唯一列并将其用作键。一旦你将 PK 添加到表中,所有这些问题都将得到解决。

【讨论】:

  • 我的表中有多个 coulumns,符合 PK 条件,我可以看到这些在设计器中被标记为实体键。 User_id 是这些列之一,但我无法删除记录并且我收到上述异常。
【解决方案2】:

该消息说明了问题所在,但不是很好。我会尽量详细说明。

实体框架默认生成获取对象的查询。您的“会话”对象的 EntityContainer 具有显式查询,这意味着您的 EntityFramework 已被告知使用特定的手写 sql(或存储的过程)来获取会话。

当您覆盖该行为时,您还必须提供一个查询来告诉它如何删除会话。 Here is the documentation 了解如何将这样的删除功能添加到您的实体框架容器中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多