2011-09-20 2 views
1

두 개의 데이터베이스 테이블이 있습니다. 하나는 이벤트 용이고 하나는 RecurrenceRules 용입니다. 이벤트에는 RecurrenceRuleID를 가리키는 FK가 있습니다.다른 컨텍스트의 엔티티에 NavigationProperty를 저장하려면 어떻게해야합니까?

내가 원하는 것은 새로운 컨텍스트에서 이벤트 저장 및 반복 규칙이지만 원하는 작업을 수행 할 수 없습니다. 나는 무엇이 없는가 ??

using (var context = new ScheduledEventEntities()) 
{ 
    if (obj.EntityKey == null) 
    { 
     context.AddObject(obj.EntityKey.EntitySetName, obj); 
    } 
    else 
    { 
     var existingObject = context.Events.FirstOrDefault(p => p.Ident == obj.Ident); 
     context.ApplyCurrentValues<Event>(obj.EntityKey.EntitySetName, obj); 

     // How do I save obj.RecurrenceRule? 
    } 

    context.SaveChanges(); 
} 
+0

개체 추적을 사용하도록 설정 했습니까? – VdesmedT

답변

2

내가 이런 식으로 시도 할 것 :

// ... 
var existingObject = context.Events.Include("RecurrenceRule") 
    .FirstOrDefault(p => p.Ident == obj.Ident); 
context.ApplyCurrentValues<Event>(obj.EntityKey.EntitySetName, obj); 

// 1st case: Relationship to RecurrenceRule has been removed or didn't exist 
if (obj.RecurrenceRule == null) 
    existingObject.RecurrenceRule = null; 
// 2nd case: Relationship to RecurrenceRule must be set or updated 
else 
{ 
    // relationship has changed 
    if (existingObject.RecurrenceRule == null || 
     obj.RecurrenceRule.Id != existingObject.RecurrenceRule.Id) 
    { 
     var existingRecurrenceRule = context.RecurrenceRule 
      .SingleOrDefault(r => r.Id == obj.RecurrenceRule.Id); 
     if (existingRecurrenceRule != null) // RecurrenceRule exists in DB 
     { 
      // Update scalar values 
      context.ApplyCurrentValues<RecurrenceRule>(
       obj.RecurrenceRule.EntityKey.EntitySetName, obj.RecurrenceRule); 
     } 
     else // RecurrenceRule does not exist in DB 
     { 
      // nothing to do, SaveChanges will recognize new RecurrenceRule 
      // and create INSERT statement 
     } 
     // set new relationship 
     existingObject.RecurrenceRule = obj.RecurrenceRule; 
    } 
    else // same relationship: just update scalar values 
    { 
     // Update scalar values 
     context.ApplyCurrentValues<RecurrenceRule>(
      obj.RecurrenceRule.EntityKey.EntitySetName, obj.RecurrenceRule); 
    } 
} 

// ... 

문제는 당신이 탐색 속성을 직접 업데이트를 처리 할 수 ​​있도록 ApplyCurrentValues 만, 스칼라 속성이 아닌 탐색 속성을 업데이트에 대한 관심 것이 사실입니다. 불행하게도 분리 된 개체 그래프를 업데이트하는 것은 거의 항상 지루한 코드로 이어집니다. Entity Framework에서이 작업을 수행하는 기본 제공 메커니즘이 없기 때문입니다.

+1

'ResourceRule' 자체를 업데이트하면 작동하지만 리소스 규칙 참조 (FK 값 변경)를 변경하면 작동하지 않습니다. –

+0

다음 오류가 발생합니다 :'제공된 객체의 키와 일치하는 키를 가진 객체를 ObjectStateManager에서 찾을 수 없습니다. 제공된 오브젝트의 키 값이 변경 사항이 적용되어야하는 오브젝트의 키 값과 일치하는지 확인하십시오. – Rachel

+0

@Rachel : Ladislav의 주석이 참이고 변경된 관계가 있으므로 예외가 발생할 수 있습니다. 내 대답 (다른 모든 경우는 아마 더 똑똑하게 결합 될 수 있지만 희망적으로 논리는 분명합니다)에서 다른 사례를 처리하려고했습니다. – Slauma

관련 문제