2013-05-17 3 views
0

마지막 개체 변경 내용을 추적하려고합니다.이 마지막 변경 내용은 "head"개체에 저장됩니다. 나는 그것을 스케치 할 것이다.오버라이드의 개체 컨텍스트에 액세스 SaveChanges

Project에는 Activities의 목록이 들어 있으며, 차례로 다른 속성을 가진 Actions의 목록이 있습니다. Project에는 Project의 모든 속성 또는 해당 '하위 개체'의 속성에서 마지막 업데이트를 유지하려는 속성 인 LastUpdateDate이 있습니다. 다음과 같이

이 들어 나는 엔티티 프레임 워크의 SaveChanges 메소드를 오버라이드 (override) :

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

내 개체 계층 구조에 연결할 수없는 것 같습니다. 특정 유형으로 캐스팅해야하는'entries'만이 너무 많이 반복해야합니다. 그래서 왜 내 개체 설정을 실제 개체로 사용할 수있게하고 싶습니다. – 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' 만 가지고있을 때 어떻게합니까? 'activityId' 만 갖는'Action'도 마찬가지입니다. – Tikkes

0

내가이 질문의 첫 번째 부분에 응답 할 수 있습니다 : 다음은 ObjectContext를 액세스하는 방법은 다음과 같습니다

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