我使用EF 6.1来跟踪从抽象基类HistoryData
继承的所有对象的更改,并将每个Versions
保存在父对象的集合中。
他们像这样联系起来:
modelBuilder.Entity<Foo>()
.HasMany(f => f.Versions)
.WithRequired(fv => fv.Parent)
.HasForeignKey(fv => fv.ParentID);
我没有修改条目,而是挂钩DbContext
并执行此操作:
public override async Task<int> SaveChangesAsync()
{
foreach (var entry in ChangeTracker.Entries<HistoryData>().Where(e => e.State == EntityState.Modified))
{
InsertInsteadOfUpdate(entry);
}
return await base.SaveChangesAsync();
}
private void InsertInsteadOfUpdate(DbEntityEntry<HistoryData> entry)
{
// ValidFrom is not set manually -> Set it automatically to now
if (entry.OriginalValues["ValidFrom"].Equals(entry.CurrentValues["ValidFrom"]))
{
entry.Entity.ValidFrom = DateTime.Now;
}
// Insert instead of Update
entry.State = EntityState.Added;
}
到目前为止工作正常,插入实体而不是更新。
但是,当我致电HistoryData
时,系统不会自动加载新的Foo.Versions
实体。
所以现在我在InsertInsteadOfUpdate
结束时做了类似的事情:
// Mark collection of parent as not loaded so that it gets lazy loaded on the next call
var parent = entry.Reference("Parent").CurrentValue;
Entry(parent).Collection("Versions").Load();
这样可行,但它会立即重新加载Collection。如果我在查询HistoryData
之前插入了几个Versions
对象,这是很多不必要的工作。
我真正想做的就是在下次查询时标记要重新加载的父项的Collection()。有没有办法做到这一点?
我试过
Entry(parent).Collection("Versions").IsLoaded = false;
但由于某种原因,下次调用时没有导致Collection延迟加载。