0

所以我想跟踪对我的任何对象所做的最后一次更改,最后一次更改保存在“头”对象上。我会画出来的。

我有一个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]...

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

4

2 回答 2

1

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

public override int SaveChanges()
{
    this.ChangeTracker.DetectChanges();
    var objectContext = ((IObjectContextAdapter)this).ObjectContext;
}
于 2015-09-01T20:52:06.413 回答
0

Try this:

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();
}
于 2013-05-17T07:52:44.653 回答