删除实体框架中的行时出错

时间:2013-07-15 14:24:23

标签: entity-framework

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

  

无法删除该对象,因为在该对象中找不到该对象   ObjectStateManager。

   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();

            }

1 个答案:

答案 0 :(得分: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()在下一行,以使我们的代码段之间的差异更明显。让我们一步一步地修改它:

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

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

    我的代码返回IEnumerable<xticketitem>。它的主要区别在于。

  2. 当您致电context.DeleteObject(r)时,您的r变量是bool。并且您在上下文中调用DeleteObject方法。该mathod接受object类型的参数(这就是为什么你在编译时没有得到错误)。

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