在覆盖保存更改中访问对象上下文

本文关键字:对象 上下文 访问 覆盖 保存更改 | 更新日期: 2023-09-27 18:13:57

所以我想跟踪对我的任何对象所做的最后更改,这最后一次更改保存在"head"对象上。我会画出它。

我有一个对象Project包含一个Activities列表,而又有一个具有不同属性等Actions的列表。Project有一个属性LastUpdateDate,我想在该属性上保留对Project本身或其任何"子对象"的任何属性所做的最后更新。

为此,我覆盖实体框架的SaveChanges方法,如下所示:

public override int SaveChanges() {
var changedEntries = ChangeTracker.Entries();
if (changedEntries != null)
        {
            var dbEntityEntries = changedEntries as IList<DbEntityEntry> ?? changedEntries.ToList();
            foreach (var entry in dbEntityEntries.Where(c => c.State != EntityState.Unchanged))
            {
                var proj = entry.Entity as Project;
                if (proj != null)
                {
                    proj.LastUpdateDate = DateTime.UtcNow;
                }
                var prop = entry.Entity as Activity;
                if (prop != null)
                {
                    var changedProject = dbEntityEntries.Single(x => (x.Entity is Project) && ((Project) x.Entity).Id == prop.ProjectId);
                    ((Project) changedProject.Entity).LastUpdateDate = DateTime.UtcNow;
                }
            }
        }
        return base.SaveChanges();
    }

与上面的示例中相比,我的数据集更大,属性更多,因此我不想遍历每个实体,因为这会占用太多时间。

相反,我想访问我的ObjectContext,这样我就可以说例如:project[0].Activity[1]...

这里有人知道如何达到这种情况吗?

在覆盖保存更改中访问对象上下文

我可以回答这个问题的第一部分:以下是您访问 ObjectContext 的方法:

public override int SaveChanges()
{
    this.ChangeTracker.DetectChanges();
    var objectContext = ((IObjectContextAdapter)this).ObjectContext;
}

试试这个:

public override int SaveChanges()
{
    var changedEntries = ChangeTracker.Entries();
    if (changedEntries != null)
    {
        var dbEntityEntries = changedEntries as IList<DbEntityEntry> ?? changedEntries.ToList();
        dbEntityEntries.Select(i=>i.Entity).OfType<Project>().Distinct()
            .Union(dbEntityEntries.Select(i=>i.Entity).OfType<Activity>().Select(activity=>activity.Project))
                .Union(dbEntityEntries.Select(i=>i.Entity).OfType<Action>().Select(action => action.Activity.Project))
        .Distinct().ToList()
        .ForEach(p => p.LastUpdateDate = DateTime.UtcNow);
    }
    return base.SaveChanges();
}