【发布时间】: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