标记要重新加载的实体的集合

时间:2014-04-10 12:58:30

标签: c# .net entity-framework ef-code-first entity-framework-6.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();

这样可行,但它会立即重新加载Collection。如果我在查询HistoryData之前插入了几个Versions对象,这是很多不必要的工作。

我真正想做的就是在下次查询时标记要重新加载的父项的Collection()。有没有办法做到这一点?

我试过

Entry(parent).Collection("Versions").IsLoaded = false;

但由于某种原因,下次调用时没有导致Collection延迟加载。

0 个答案:

没有答案