2013-05-17 2 views
0

Итак, я хочу отслеживать последнее изменение, сделанное для любого из моих объектов, это последнее изменение сохраняется на «головном» объекте. Я нарисую его.Контекст объекта доступа в переопределении 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

Как это сделать, если у меня нет объекта 'Project' непосредственно в' Activity', а только 'projectId'. То же самое касается 'Action' только с' activityId'? – Tikkes

0

Я могу ответить на первую часть этого вопроса: Вот как вы получаете доступ к ObjectContext:

public override int SaveChanges() 
{ 
    this.ChangeTracker.DetectChanges(); 
    var objectContext = ((IObjectContextAdapter)this).ObjectContext; 
} 
Смежные вопросы