使用SQL删除对象并更新上下文

时间:2012-06-05 11:55:31

标签: entity-framework entity-framework-4

我正在使用EF并且有一个上下文,我通过上下文中的ExecuteStoreCommand函数使用简单的SQL调用删除了表中的行(由于其他原因,我必须这样做)。它工作正常,但上下文不知道发生了什么。

我在尝试提交某些更改时使用相同的上下文时遇到问题,因为提交未提供预期的受影响行数。

我的问题是,用我所做的更改(已删除的行)更新上下文的最佳方法是什么。

我已经尝试获取已删除的对象并在上下文刷新功能中使用它,但它确实不起作用,可能是因为它(正确)在尝试获取已删除的对象时获取空引用。

_ctx.Refresh(RefreshMode.StoreWins, _ctx.Employees.FirstOrDefault(s => s.EmployeeId == employeeId));

此外,使用ObjectStateManager.GetObjectStateEntries对我来说也不起作用,因为它不知道哪些对象已被删除。

我不想:

  • 重新创建上下文。
  • 刷新比我需要的更多。
  • 懒得加载。

我只想在删除后再次更新上下文。

1 个答案:

答案 0 :(得分:1)

试试这个(你必须以某种方式识别被删除的实体 - 如果你不知道你是如何完成的,而解决方案只是一个新的背景):

var employee = ctx.ObjectStateManager.GetObjectStateEntries(~EntityState.Detached)
                                     .Where(e => !e.IsRelationship)
                                     .Select(e => e.Entity)
                                     .OfType<Employee>()
                                     .FirstOrDefault(e => e...);
if (employee != null) ctx.Detach(employee);

顺便说一下。不要对附加实体使用直接SQL修改。这是你可以做的最糟糕的操作。 EF不期望这样,也无法处理它。在这种情况下,最好的解决方案是重新创建上下文。