所以我想跟踪对我的任何对象所做的最后一次更改,最后一次更改保存在“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}}
有没有人知道如何达到这种状况?
答案 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;
}