2009-08-26 2 views
0

가 어떻게 NHibernate에 이러한 behaviuor을 할 수 NHibernate에 업데이트에 개체 사본을 실현. pId는 원본 ID로 설정되어야합니다. 이전 엔티티는 변경되지 않아야합니다.

그래서 이것은 pId가 변경 불가능한 ID이고 Id-는 버전과 같은 버전 시스템과 같아야합니다. 버전 매핑 속성을 사용하려고했지만 버전 필드를 업데이트합니다. 전체 엔터티를 다시 만들면됩니다. 어떤 접근 방식이 더 좋을까요?

답변

1

Google 애플리케이션 용 버전 시스템을 작성했습니다. 나는 버전 객체를 두 개의 클래스로 분리했다. 하나는 전체 객체를 나타내고 하나는 버전을 나타낸다.

우리 소프트웨어에서는 버전 관리가 비즈니스 로직의 일부입니다. 응용 프로그램은 기록에 대한 액세스 권한을 제공하며 사용자는 버전 관리를 일부 제어 할 수 있습니다.

따라서 새 버전이 메모리에 생성됩니다. 전체 복사본을 수행해야합니다. 루트 엔티티와 그 모든 자식에 인터페이스를 구현하여이를 구현할 수 있습니다. 이 인터페이스는 객체 그래프를 통해 재귀 적으로 호출되는 DeepCopy 메소드를 제공합니다.

object에 보호 된 MemberwiseCopy 방법이 있습니다. 도움이 될 수 있습니다. 깊은 사본이 아닙니다.

각 단일 속성을 복사하는 코드를 통증이 유지하기를 원하지 않았습니다. 그래서 우리는 메모리에 객체 그래프를 복사 직렬화를 사용하고 있습니다 :

public static T CopyDataContract<T>(T obj) 
{ 
    NetDataContractSerializer serializer = new NetDataContractSerializer(); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     serializer.Serialize(stream, obj); 
     stream.Position = 0; 
     return (T)serializer.Deserialize(stream); 
    } 
} 

는 또한, 우리는 ID를 재설정 개체의 메소드를 가지고 다른 정리 작업을 수행합니다. 이것은 또한 객체 그래프를 통해 재귀 적으로 수행됩니다.

현재로서는 문제가 없습니다. 앞으로 인터페이스 구현에 대해 리팩토링해야 할 필요가있을 것입니다. 인터페이스 구현은 좀 더 깔끔합니다.

0

기록이 내 도메인 논리의 일부가 아닌지에 따라 트리거를 사용하는 것이 좋습니다. 도메인 논리의 일부가 아니므로 사용자에게 표시 할 필요가 없으며 기존 버전에서 사본을 만들지 않습니다.

트리거를 사용하면 몇 가지 옵션이 있습니다. 가장 간단한 것입니다 (실제로 소수의 테이블에 대해서만 내역을 저장해야 함을 의미 함). 원래 테이블의 복사본 인 별도의 _history 테이블을 가질 수 있습니다.

대체로 정확히 당신이 무엇에 있는지에 달려 있습니다.