【问题标题】:Error deleting rows in entity framework删除实体框架中的行时出错
【发布时间】:2013-07-15 14:24:22
【问题描述】:

当我尝试使用实体框架删除行时收到此错误。真的不明白为什么!

无法删除该对象,因为它在 对象状态管理器。

   public void Delete(int ticketID)
            {

                Modules.Entity.gmEntities context = new Modules.Entity.gmEntities();

                var ticketitem = context.xticketitem.Select(p => p.TicketID == ticketID);

                ticketitem.ToList().ForEach(r => context.DeleteObject(r));

                context.SaveChanges();

            }

【问题讨论】:

标签: entity-framework


【解决方案1】:

通过调用context.xticketitem.Select(p => p.TicketID == ticketID);,您将获得上下文中不存在的布尔值列表。

我认为你应该这样做:

var ticketitem = context.xticketitem.Where(p => p.TicketID == ticketID);
ticketItem.ToList().ForEach(r => context.xticketitem.DeleteObject(r));
context.SaveChanges();

编辑: 我已将.ToList() 移至下一行,以使我们的 sn-ps 之间的差异更加明显。让我们尝试一步一步地修改它:

  1. 当您致电var ticketitem = context.xticketitem.Select(p => p.TicketID == ticketID);

    您正在创建查询,该查询将通过所有 xticketitems 并返回每个项目的 TicketID 是否等于作为参数传递给您的 Delete 方法的 ticketID 变量。 此查询的结果是IEnumerable<bool>

    我的代码返回IEnumerable<xticketitem>。这是主要区别。

  2. 当您调用 context.DeleteObject(r) 时,您的 r 变量是布尔值。并且您正在上下文中调用 DeleteObject 方法。该方法接受 object 类型的参数(这就是为什么在编译时不会出错)。

    我在 xticketitem ObjectSet 上调用 DeleteObject,它接受 xticketitem 类型的 strogly 类型参数。

【讨论】:

  • 我认为你的代码和我的代码是一样的。我只是在不同的行使用 ToList()
  • 我已经编辑了我的答案。请更仔细地比较你和我的代码 sn-ps。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2011-08-30
  • 2013-02-19
  • 2015-10-01
相关资源
最近更新 更多