我正在调试一堆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代码没有人理解。
答案 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 的更新分配解决了该问题。