对象处于分离状态。分离对象时,无法在ObjectStateEntry上执行此操作

时间:2013-06-05 19:18:59

标签: entity-framework entity-framework-4

我正在调试一堆MVC / EF代码,其他人已经从Java编写过翻译。

代码中的一个片段类似于:

public ActionResult Index()
    {
        using (var context = new Models.FooEntities())
        {
            var exp = context.Expenses.FirstOrDefault(e => e.Id == 17);

            if (exp != null)
            {
                context.Expenses.DeleteObject(exp);
                context.SaveChanges();
            }
        }

        return Content("Deleted");
    }

简单。对?它应该删除ID为17的实体费用。

但是,对SaveChanges的调用会使用InvalidOperationException

消息引发"The object is in a detached state. This operation cannot be performed on an ObjectStateEntry when the object is detached."

现在,我理解这个消息,我感到很惊讶,因为所讨论的实体永远不会脱离上下文。至少从我在上面的片段中看到的内容。

可能不仅仅是满足需求,但是当我没有更多选择时,我会认为这是一个选项,因为跟踪这个vast的整个调用堆栈是一个噩梦,这些代码主要是写得很糟糕的Java代码没有人理解。

3 个答案:

答案 0 :(得分:0)

你可以尝试这样修改:

if (exp != null)
            {
                context.Expenses.Attach(ex);
                context.Expenses.DeleteObject(exp);
                context.SaveChanges();
            }

答案 1 :(得分:0)

我有相同的错误消息,并且还确定该实体未与DbContext分离。在我的情况下,事实证明我忘了定义一个复杂的类型,这个类型存在于一个显然是分离的类中。在编译时和数据库构建时,似乎没有出现任何问题,但在运行时发生此错误。一旦复杂类型被正确映射,它就像预期的那样。在您的情况下可能会出现类似情况(现在可能已经解决了)。

答案 2 :(得分:0)

当我尝试使用代码更新状态为诸如会员之类的实体时,出现此错误:

member.status = newStatus;

在我的实体映射设置中,我有以下代码:

HasRequired(t => t.Status).WithMany(t => t.EmployeeStatus).Map(m => m.MapKey("StatusId")).WillCascadeOnDelete(false);

我通过根据需要将ID分配给实体来解决此问题,并通过工作单元进行保存/更新:

member.StatusId = newStatus.StatusId;

不确定这是否会帮助任何人,甚至不确定为什么会发生这种情况?但是我遇到了以上错误,并且 ID 的更新分配解决了该问题。