1

我正在使用 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 在下一次调用时延迟加载。

4

0 回答 0