2017-05-04 130 views
0

在我的上下文中,我删除了一个现有实体。而在同样的情况下,我尝试添加一个新的实体,使用下面的代码:实体框架:在删除后向添加物添加新实体的问题

 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会抛出异常?

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

这里是调用堆栈: enter image description here

+0

那么实体只有原始属性?你确定它没有关联的实体可能与关联的实体相同吗? –

+0

@AlexPaven不,它不是直接或间接地引用被删除的实体。我有学生和背包实体。背包参考学生。我删除了学生的背包之一。现在正在尝试创建一个新的学生实体。当我检查新创建的实体的状态时,我得到异常。我也通过创建一个根本没有关联的实体进行验证,我仍然得到相同的异常。 – Dilshod

+0

这听起来很奇怪。我很好奇这个异常的栈跟踪是什么。但是,从我的头顶上看,只要给出这个信息,我就不会想到会导致这种情况。除非定义了主键,否则EF会决定新添加的实体与删除的实体相同,或者类似的东西。 –

回答

0

EFContext.Entry(实体)将实体在这一点上添加上下文。

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