0

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

当我尝试提交一些更改时使用相同的上下文时,我稍后会遇到问题,因为提交没有给出预期的受影响行数。

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

我已经尝试获取已删除的对象并在上下文刷新函数中使用它,但它并没有真正起作用,可能是因为它(正确地)在尝试获取已删除的对象时获得了一个空引用。

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

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

我不想:

  • 重新创建上下文。
  • 刷新比我需要的更多。
  • 与延迟加载混为一谈。

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

4

1 回答 1

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 没有预料到这一点,它无法处理它。在这种情况下,最好的解决方案是重新创建上下文。

于 2012-06-05T12:46:28.537 回答