2009-08-19 4 views
3

필자는 일대 다 연관 하위 엔터티의 변경 내용을 데이터베이스에 쓰고 변경 내용을 저장하지 않아도되는 시나리오를 실행했습니다. 부모 엔티티전체 컨텍스트 대신 단일 엔터티 저장

Entity Framework는 현재 컨텍스트 범위 (EntityContext.SaveChanges())에서 데이터베이스 커밋을 처리하므로 관계를 강화하는 데 적합합니다.하지만 최상의 방법이나 권장 방법이 있는지 궁금합니다. 전체 컨텍스트 대신 개별적인 엔티티에 대한 세분화 된 데이터베이스 커밋을 수행하십시오.

+1

나는 지금까지 이것을 할 수있는 방법을 보지 못했지만 아마 맞을 것이다. 찾고있는 것은 데이터에 불일치가 생길 수 있습니다. – ADB

답변

7

모범 사례? 게다가 "하지 마라"라는 뜻입니까?

데이터베이스 상태와 다른 ObjectContext를 만드는 것이 가장 좋은 방법이라고 생각하지 않습니다.

이 작업을 수행해야하는 경우 새 ObjectContext를 새로 작성하고 거기에 하위 엔티티를 변경합니다. 그렇게하면 두 문맥 모두 일관성을 유지하게됩니다.

+2

별도의 컨텍스트를 사용하는 것이 좋은 방법입니다. 프로세스는 기본적으로 다음과 같습니다. 1) 다른 ObjectContext를 만들고 거기에 자식 객체를 연결합니다. 2) 부모 탐색 속성의 EntityKey를 설정합니다. 3) 새 컨텍스트를 저장하고 자식을 분리합니다. 4) "기본"컨텍스트에 자식을 연결합니다. – dkr88

2

이 작업은 AcceptAllChanges()를 사용하여 수행 할 수 있습니다.

상위 엔티티를 변경하고 AcceptAllChanges()를 호출 한 다음 관련 엔티티를 변경하고 SaveChanges()를 호출하십시오. 부모에 대한 변경 사항은 엔티티에 "커밋"되었지만 데이터베이스에 저장되지 않았기 때문에 저장되지 않습니다.

using (AdventureWorksEntities adv = new AdventureWorksEntities()) 
{ 
    var completeHeader = (from o in adv.SalesOrderHeader.Include("SalesOrderDetail") 
          where o.DueDate > System.DateTime.Now 
          select o).First(); 
    completeHeader.ShipDate = System.DateTime.Now; 
    adv.AcceptAllChanges(); 
    var details = completeHeader.SalesOrderDetail.Where(x => x.UnitPrice > 10.0m); 
    foreach (SalesOrderDetail d in details) 
    { 
      d.UnitPriceDiscount += 5.0m;  
    } 
      adv.SaveChanges(); 
} 
+1

Makes 감각 - 그럼에도 불구하고 여전히 부모 객체에 대한 변경 사항을 추적하고 커밋해야한다면 AcceptAllChanges()를 수행 한 후에이를 수행 할 수있는 능력을 잃을 것입니다 (올바른지?). – dkr88

4

나는 비슷한 필요성이 있습니다. 내가 고려중인 솔루션은 실제 엔터티 속성에 영향을 미치지 않으면 서 개인적으로 속성 변경 내용을 저장하는 모든 엔터티에 래퍼 속성을 구현하는 것입니다. 그런 다음 엔터티에 변경 내용을 쓰고 컨텍스트에서 SaveChanges()를 호출하는 엔터티에 SaveChanges() 메서드를 추가합니다.

이 방법의 문제점은 모든 항목을이 패턴과 일치시켜야한다는 것입니다. 그러나, 그것은 꽤 잘 작동하는 것 같습니다. 그것은 많은 단점을 가지고 있습니다. 많은 양의 많은 오브젝트를 변경하면 많은 양의 데이터가 메모리에 저장됩니다.

내가 생각할 수있는 유일한 해결책은 변경 사항을 저장하면 모든 변경/추가/삭제 된 항목의 엔티티 상태를 저장하고 변경중인 항목을 제외한 수정되지 않은 항목으로 설정하고 변경 사항을 저장 한 다음 다른 개체의 상태를 복원합니다. 그러나 그것은 잠재적으로 느린 것으로 들립니다.

관련 문제