2013-05-17 92 views
0

因此,我想跟蹤對我的任何對象所做的最後更改,這最後一個更改保存在「head」對象上。我會畫它。覆蓋訪問對象上下文SaveChanges

我有一個對象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]...

有沒有人在這裏得到了關於如何達到這一情況的任何想法?

+0

你想從'ObjectContext'方法訪問'ObjectContext'重寫?你有什麼困難? – Dennis

+0

我似乎不能去我的對象層次結構。只有'條目',我需要投到一個特定的類型,這種方式我需要循環太多。這就是爲什麼我希望我的對象設置可用作實際對象。 – Tikkes

+0

什麼是「我的對象設置」?你能用一段你想得到的僞代碼來更新這個問題嗎? – Dennis

回答

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

如何在「Activity」本身沒有我的'Project'對象,但只有'projectId'時如何執行此操作。只有'activityId'的'Action'也一樣? – Tikkes

0

我能回答這個問題的第一部分:這裏是你如何訪問的ObjectContext:

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