我的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
属性。
为什么页面属性不会在数据库中更新?
答案 0 :(得分:0)
由于Entity Framework
设置_unitOfWork.Context.Configuration.AutoDetectChangesEnabled = false;
时的工作方式,因此子实体很可能无法更新。为了解决这个问题,应该足以在保存更改之前将状态更改为true
。换句话说,请在您的代码中尝试:
...
_unitOfWork.Context.Entry(existingBook).State = EntityState.Modified;
}
}
_unitOfWork.Context.Configuration.AutoDetectChangesEnabled = true;
_unitOfWork.Save();