Entity framework 实体框架未在禁用自动更改跟踪的情况下更新导航属性

Entity framework 实体框架未在禁用自动更改跟踪的情况下更新导航属性,entity-framework,Entity Framework,我的域逻辑中有一个unitOfWork,它检索数万个XML节点,从XML中创建称为retreivedBooks的断开连接的实体,并基于retreivedBooks更新数据库中的书籍实体。对于我的应用程序中这个特定unitOfWork的dbContext,当数据库中有很多实体时,由于性能非常差,我已经禁用了更改跟踪。这提高了性能-非常好 但是,它不再更新导航属性。下面是一个虚构的示例来演示该问题: public class Book { public string Title;

我的域逻辑中有一个unitOfWork,它检索数万个XML节点,从XML中创建称为
retreivedBooks
的断开连接的实体,并基于
retreivedBooks
更新数据库中的书籍实体。对于我的应用程序中这个特定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();
公共课堂教材
{
公共字符串标题;
公共字符串作者;
公共虚拟列表页面;
}
_unitOfWork.Context.Configuration.AutoDetectChangesEnabled=false;
_unitOfWork.Context.Configuration.ValidateOnSaveEnabled=false;
foreach(图书检索图书中的图书检索图书)
{
Book existingBook=\u unitOfWork.BookRepository.SingleOrDefault(b=>b.Id=retrievedbook.Id);
if(book!=null)
{
existingBook.Title=retrievedbook.Title;
existingBook.Author=retrievedbook.Author;
existingBook.Pages=RetrievedBook.Pages;
_unitOfWork.Context.Entry(existingBook).State=EntityState.Modified;
}
}
_unitOfWork.Save();
在上面的示例中,数据库中书籍的标题和作者属性得到正确更新,但页面列表没有得到正确更新

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


为什么数据库中的pages属性没有得到更新?

这是由于设置
\u unitOfWork.Context.Configuration.AutoDetectChangesEnabled=false时
实体框架的工作方式造成的子实体很可能不会得到更新。为了解决此问题,在保存更改之前,应将状态更改为
true
。换句话说,请在代码中尝试以下操作:

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

是的,这会解决问题,但正如前面提到的,当启用AutoDetectChanges时,当数据库中有很多实体时,我的性能会非常差,因为每当EF调用DetectChanges(或其他东西)@DanCook时,它必须加载整个对象图。好的,它只是能够更新子实体。我很确定您可以只
\u unitOfWork.Context.Configuration.AutoDetectChangesEnabled=true_unitOfWork.Save()_unitOfWork.Context.Configuration.AutoDetectChangesEnabled=false或其他解决方法。