0

我正在调试一堆 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 的实体 Expense。

但是,调用 toSaveChanges会引发InvalidOperationException带有消息的 an,"The object is in a detached state. This operation cannot be performed on an ObjectStateEntry when the object is detached."

现在,我理解了这个信息,我很惊讶,因为所讨论的实体从未脱离上下文。至少从我在上面的片段中看到的。

可能有更多的东西,但是当我没有更多选择时,我会考虑将其作为一个选项,因为跟踪这个巨大的大部分写得很糟糕的 Java 代码的音译的整个调用堆栈是一场噩梦,没有人明白。

4

3 回答 3

0

我收到了相同的错误消息,并且还确定该实体没有与 DbContext 分离。在我的例子中,我忘记定义一个复杂类型,它驻留在明显分离的类中。在编译时和数据库构建时似乎没有任何问题,但在运行时发生了此错误。一旦复杂类型被正确映射,它就会按预期进行。在您的情况下,也许有类似的情况(现在可能已经解决了)。

于 2014-02-10T15:45:11.823 回答
0

您可以尝试像这样进行修改:

if (exp != null)
            {
                context.Expenses.Attach(ex);
                context.Expenses.DeleteObject(exp);
                context.SaveChanges();
            }
于 2013-06-23T13:45:17.620 回答
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的更新分配解决了这个问题。

于 2019-06-11T23:49:15.520 回答