2013-06-05 35 views
0

有一堆MVC/EF代码,我正在调试,其他人已经从Java编写过渡过。从代码对象处于分离状态。当对象被分离时,该操作无法在ObjectStateEntry上执行

一个片断类似于此:

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."

现在,我明白了消息,我很惊讶,因为根据有关机构是从来没有与上下文分离。至少从我在上面的代码片段中看到的。

可能不仅仅是满足眼睛,但我会考虑作为一个选项,当我没有更多的选择,因为这是一个噩梦跟踪整个调用堆栈这个大部分写得不好的Java代码没有人理解。

+0

乍一看我唯一能想到的就是在上下文本身中禁用延迟加载_and_删除实体会触发级联删除,但是不会通过数据库中的级联删除FK约束来实现。 –

+0

这使得很多意义。谢谢。阿玛明天尝试并报告回来。 –

+0

它也可以是一个非延迟加载的集合,因为它不是'虚拟'的,或者可以禁用代理生成。 –

回答

0

你可以尝试做这样的修改:

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

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