【问题标题】:Entity Framework: Issue with adding new entity to the contex after deleting实体框架:删除后将新实体添加到上下文的问题
【发布时间】:2017-05-05 03:09:26
【问题描述】:

在我的上下文中,我正在删除现有实体之一。在相同的上下文中,我尝试使用以下代码添加一个新实体:

        if (entity != null && EFContext.Entry(entity).State == EntityState.Detached)
        {
            try
            {
                var entityName = entity.GetType().Name;             
                GetObjectContext.AddObject(entityName + "s", entity);
            }
            catch (Exception ex)
            {
                log(ex);
                throw;
            }
        }

我遇到的问题是当我将新创建的实体传递给上面的方法时,当它检查实体状态时,它会抛出异常: *

添加与处于已删除状态的实体的关系是 不允许

我没有和被删除的实体建立任何关系,为什么会抛出这个异常?我正在尝试在另一个简单的项目中重现该问题,但无法在那里重现它。 有谁知道为什么 EF 会抛出那个异常?

更新: 我有学生和背包实体。背包参考学生(一对多)。就我而言,我正在删除其中一个背包并尝试创建一个新的学生实体。当我检查对象状态时,我得到了上面的异常。

这是调用堆栈:

【问题讨论】:

  • 那么实体只有原始属性吗?您确定它没有与已删除实体相关联的实体相同吗?
  • @AlexPaven 不,它没有直接或间接引用已删除的实体。我有学生和背包实体。背包参考学生。我删除了学生的一个背包。现在尝试创建一个新的学生实体。当我检查新创建的实体的状态时,我得到了异常。我还通过创建一个根本没有关联的实体进行了验证,但我仍然得到同样的异常。
  • 这听起来很奇怪。我很好奇异常的堆栈跟踪是什么。但是在我脑海中,仅考虑到这些信息,我想不出任何可能导致这种情况的事情。除非主键的定义方式使 EF 决定新添加的实体与已删除的实体相同,或类似的东西。
  • @AlexPaven 我发布了调用堆栈。同样,当我在收到异常后尝试查看新添加的对象状态时,它说它已分离。所以这与预期的一样,但我也不清楚为什么会出现异常。
  • 我没有任何建议,除了查看 ObjectStateManager 中的每个项目,看看是否有任何不合适的地方。如果有类似的项目并且您不确定它们是否真的是对同一项目的引用,您可以在许多地方右键单击对象,例如快速监视窗口或工具提示,然后选择 Make Object ID,这将附加一些内容当您在调试器中查看对象以更轻松地识别它们时,就像对象的 '#1' 或 '$1' 一样。也许在执行的各个步骤中执行此操作,看看是否在您未预料到的上下文中添加或更改了任何内容。

标签: c# entity-framework entity-framework-6 associations


【解决方案1】:

EFContext.Entry(entity) 此时会将实体添加到上下文中。

这里的问题很可能是您删除的背包在删除后可能将FK设置为​​0或什么?如果是这样,那么当你添加这个新学生时,那个被删除的学生最终会在这个新学生的上下文中,因为它的 ID 仍然是 0。作为临时修复,请尝试在调用 Entry(entity) 之前将此新学生的 PK 设置为 -1,看看是否有任何作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多