覆盖SaveChanges中的访问对象上下文

时间:2013-05-17 07:19:51

标签: c# entity-framework-5

所以我想跟踪对我的任何对象所做的最后一次更改,最后一次更改保存在“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]...,所以我可以说:{{1}}

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

2 个答案:

答案 0 :(得分:0)

试试这个:

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();
}

答案 1 :(得分:0)

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

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