在覆盖保存更改中访问对象上下文
本文关键字:对象 上下文 访问 覆盖 保存更改 | 更新日期: 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();
}