2012-02-29 2 views
-4

간체, 개체에 대한 테이블 두 개 (ItemsProperties)를 매핑하는 Entity Framework가 있습니다. 각 항목에는 특정 속성 (일대 다)이 있습니다.관련 엔터티 추가, 제거 및 업데이트

내 프로그램 외부에서, 새 항목 또는 기존 항목의 업데이트 인 속성이있는 속성이있는 "죽은"항목이 속성을 통해 수신됩니다. 이 데이터는 WCF 호출, 웹 양식 POST, 비 직렬화에서 가져온 것일 수 있습니다. 요점은 내가받은 링크가 해제 된 데이터로 데이터베이스의 항목과 속성을 삽입 및 업데이트하려는 것입니다.

다양한 related questionsanswers (이 중 일부는 even compile이 아님)이 발견되었습니다. 문제는 내가 기존 항목 및 수신, 업데이트 항목의 속성을 동기화하는 코드의 부하를 작성해야한다 :

당신이 볼
private static void UpdateProperties(Item existingItem, Item updatedItem, TestdatabaseEntities context) 
{ 
    // Find deleted properties 
    foreach (var existingProp in existingItem.Properties.ToList()) // ToList() to work on a local copy, otherwise you'll be removing items from an enumeration 
    { 
     var inUpdate = updatedItem.Properties.Where(p => p.Name == existingProp.Name).FirstOrDefault(); 

     if (inUpdate == null) 
     { 
      // Property with this Name was not found as property in the updated item, delete it 
      context.Properties.DeleteObject(existingProp); 
     } 
    } 

    // Find added or updated properties 
    foreach (var updatedProp in updatedItem.Properties) 
    { 
     var inDatabase = existingItem.Properties.Where(p => p.ItemID == existingItem.ID && p.Name == updatedProp.Name).FirstOrDefault(); 

     if (inDatabase == null) 
     { 
      // Added 
      inDatabase = new Property { Name = updatedProp.Name }; 
      existingItem.Properties.Add(inDatabase); 
     } 

     // Updated (& added), map properties (could be done with something like AutoMapper) 
     inDatabase.Value = updatedProp.Value; 
     // etc... 
    } 

    context.SaveChanges(); 
} 

, 객체의 특정 속성 (existingItem.Properties, p.Name == existingProp.Name에 대한 다양한 참조가, p.ItemID == existingItem.ID),이 방법의 좀 더 일반적인 버전을 만들 수 있으며 약간의 재귀 (심지어는 Property 그 자체가 다른 엔티티에 대한 참조를 가진다면 어떨까요?

그러나 궁금한 점은 :이 프로세스 (전체 프로세스 또는 일부)를보다 쉽게 ​​수행 할 수 있습니까? 아니요, 보존하려는 엔티티에 다른 데이터가 있으므로 항목에서 모든 속성을 삭제하고 업데이트시 다시 추가 할 수 없습니다.

+1

당신이 묘사 한 문제는 객체 매핑 운동처럼 들립니다. 내가 당신을 올바르게 이해했다면 http://automapper.org/이 도움이 될 것입니다. – Robert

+0

@Robert 매핑은 문제가 아닙니다 ('inDatabase.Value' 행 위의 주석 참조). 단 첨부 된 항목을 첨부 된 항목과 비교하고 필요할 경우보다 우아한 방법으로 표시하는 방법 – CodeCaster

+9

나는 누군가의 명백하게 틀린 대답에 동의하지 않을 때 때때로이 질문이 무작위로 어떻게 내려가는지를 좋아하고 주석에서 그렇게 설명하려고 노력한다. 계속해서 그 2 포인트 공제는 매번 다치게됩니다. – CodeCaster

답변

3

개발자로서 코드를 작성하는 것이 당신의 직업입니다. 이것은 "많은 코드"가 아닙니다.

이 코드를 처리하는 범용적인 방법이 없습니다. 아마도 샘플을 일반화 할 수있는 방법을 찾을 수 있지만 특정 사례 집합에 맞게 조정할 수 있습니다. 간단한 방법에는 ItemProperty 클래스와 밀접하게 결합 된 많은 코드가 포함되어 있습니다. 이 코드를 일반화하려면 메서드 외부에 이러한 종속성을 처리하는 대리자 나 식을 주입해야합니다.

+7

개발자로서 지속적으로 _ "더 좋은 방법으로 할 수 있습니까?"_, 따라서 내 질문을 생각하는 것이 내 직업입니다. ;-) 나는 이것을하기위한 좀 더 일반적인 방법이 있었으면 좋겠다. EF에 내장되어있는 것이 바람직하다. 왜냐하면 이것은 단순화 된 예제이며 내 코드를 계속 반복하고 싶지 않기 때문이다. – CodeCaster

+3

아니요 EF에는 이것을 해결할 수있는 메커니즘이 내장되어 있지 않습니다 - [here] (http://stackoverflow.com/questions/3635071/update-relationships-when-saving-changes-of-ef4-poco-objects/3635326 # 3635326) 내 분석입니다. –

+1

나는 위대한 게시물을 이미 발견했는데, 이제는 내 질문에 링크를 깜박했다. 어쨌든 고마워. – CodeCaster

관련 문제