具有临时EntityKey值的对象无法附加到对象上下文

时间:2012-05-04 14:52:12

标签: c# entity-framework-4

我正在使用断开连接的Entity Framework 4对象上下文,感谢之前的一些非常棒的帮助,我已经向前迈进了。

现在,我有更多问题。在执行简单的CRUD时,EF似乎会产生不必要的障碍。在这种情况下,父子关系。

在我的情况下,我有一个现有的VatCode,它有VatRates。我加载它,显示它并允许用户添加更多VatRates。所以我们最终得到:

  

VatCode --- VatRate(现有)
           + - VatRate(由用户添加)

使用以下代码保存:

using (SopEntities sopEntities = EntitiesFactory.Create()) {
   VatRepository vatRepository = new VatRepository(sopEntities);

   foreach (VatRate vatRate in Item.VatRates) {
      if (vatRate.EntityKey == null || vatRate.EntityKey.IsTemporary) {
         sopEntities.VatRates.Attach(vatRate); 
         sopEntities.ObjectStateManager.ChangeObjectState(
            vatRate,
            System.Data.EntityState.Added
         );
      } else {
         sopEntities.VatRates.Attach(vatRate); // exception here
         sopEntities.ObjectStateManager.ChangeObjectState(
            vatRate,
            System.Data.EntityState.Modified
         );
      }
   }

   if (IsNew) {
      sopEntities.VatCodes.AddObject(Item);
   } else {
      sopEntities.VatCodes.Attach(Item);
      sopEntities.ObjectStateManager.ChangeObjectState(Item,System.Data.EntityState.Modified);
   }
   vatRepository.SaveChanges();
}

然而,当我保存时,我得到例外:

  

具有临时EntityKey值的对象无法附加到   对象上下文

我在下面附上了截图:

screenshot

我自己在集合中手动附加/添加VatRates,以尝试识别哪个对象存在问题。但是,这没有用。显示的例外是在VatCode中的正版现有VatRate上,已经一个实体密钥。可能是EF正在将对象图升级到VatCode并退回到尚未设置的其他VatRate - 因为我还没有完成它?

基本上,如何在断开连接的场景中保存其中包含的VatCode和VatRates?

1 个答案:

答案 0 :(得分:0)

当我发现这个错误时,是因为我的对象在静态修饰符下,在另一个上下文中。

您可以检查您的代码是否存在这种情况。 希望这会有所帮助:)