实体框架未更新导航属性并禁用自动更改跟踪

时间:2014-03-02 19:03:48

标签: entity-framework

我的Domain Logic中有一个unitOfWork可以检索数万个XML节点,从XML创建名为retreivedBooks的断开连接的实体,并根据retreivedBooks更新数据库中的Book实体。对于我的应用程序中的这个特定unitOfWork的dbContext,当数据库中有大量实体时,由于性能非常糟糕,我已禁用了更改跟踪。这提高了性能 - 很棒。

然而,它不再更新导航属性。这是一个用于演示问题的示例:

 public class Book
 {
      public string Title;
      public string Author;
      public virtual List<Page> Pages;
 }

_unitOfWork.Context.Configuration.AutoDetectChangesEnabled = false;
_unitOfWork.Context.Configuration.ValidateOnSaveEnabled = false;

foreach(Book retreivedBook in retreivedBooks )
{
    Book existingBook= _unitOfWork.BookRepository.SingleOrDefault(b=>b.Id=retreivedBook.Id);
    if(book!=null)
    {
         existingBook.Title=retreivedBook.Title;
         existingBook.Author=retreivedBook.Author;
         existingBook.Pages=retreivedBook.Pages;
         _unitOfWork.Context.Entry(existingBook).State = EntityState.Modified; 
    }
}
_unitOfWork.Save();

在上面的示例中,数据库中书籍的标题和作者属性会正确更新,但页面列表却没有。

顺便说一句,我不会根据检索到的页面检查现有页面。我们可以假设页面每次都是不同的,因此每次更新都会替换book.Pages属性。

为什么页面属性不会在数据库中更新?

1 个答案:

答案 0 :(得分:0)

由于Entity Framework设置_unitOfWork.Context.Configuration.AutoDetectChangesEnabled = false;时的工作方式,因此子实体很可能无法更新。为了解决这个问题,应该足以在保存更改之前将状态更改为true。换句话说,请在您的代码中尝试:

...
 _unitOfWork.Context.Entry(existingBook).State = EntityState.Modified; 
    }
}
_unitOfWork.Context.Configuration.AutoDetectChangesEnabled = true;
_unitOfWork.Save();