我正在使用 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();
这有效,但它会立即重新加载集合。如果我在查询之前插入几个HistoryData
对象Versions
,这是很多不必要的工作。
我真正想做的就是标记父级的 Collection() 以在我下次查询时重新加载。有没有办法做到这一点?
我试过了
Entry(parent).Collection("Versions").IsLoaded = false;
但由于某种原因,这并没有导致 Collection 在下一次调用时延迟加载。