2009-03-19 2 views
2

변경 사항을 실행 취소하고 이전 버전으로 롤백 할 수 있도록 "이전 버전"을 만들고 싶습니다.복제 객체 그래프가 중복되어 nhibernate에서 새 것으로 유지됩니다.

다양한 속성을 가진 관리자 개체와 관리되는 직원이 있습니다. 이것은 외부 키로 관리자에 링크 된 스태프를 가진 데이터베이스의 두 테이블과 관련됩니다.

관리자와 모든 직원을 복제하여 관리자 테이블에 새 항목으로 저장하고 직원 테이블에 새로운 항목을 추가하여 데이터베이스에 저장하는 것이 좋습니다. 매니저.

나는 이것을 사용하여 영리한 방법이 있는지 궁금해하고 nhibernate를 사용하고 있습니다. 내가이 일을 생각할 수

유일한 방법은 수동이다 :

manager old = getManager(); // get the original for copying 

manager newManager = new manager(); // create a blank object 
newManager .name = old.name //give the new manager the old one's props; 

//cycle through the staff duplicate and add to new managers staff collection 
foreach(staff s in old.staffCollection) 
{ 
    staff newStaff = new staff(); 
    newstaff.name = s.name; 
    newManager.staffCollection.Add(newstaff); 
} 

위의 예는 내가 그것을 할 거라고 방법을 정확하게하지 않습니다하지만 당신은 내가 희망 아이디어를 얻을.

저는 반사를 사용하여 수동으로 설정하는 대신 소품을 얻는 방법에 대해 생각해 보았습니다.

거기에 개체 그래프를 복사하고 새로운 항목으로 다시 유지 nhibernate 방법이 있습니까?

누구나 가지고있는 멋진 아이디어가 있습니까 ??

+0

예제 코드 일 뿐이지 만,'manager'와'staff' 클래스 이름이 정말로 소문자가 아니길 바랍니다. – kroimon

답변

0

엔터티를 직렬화 가능으로 표시하면 이진 직렬화를 수행 할 수 있습니다.

public static MemoryStream Serialize(object data) 
    { 

     MemoryStream streamMemory = new MemoryStream(); 
     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.AssemblyFormat = FormatterAssemblyStyle.Simple; 

     formatter.Serialize(streamMemory, data); 

     return streamMemory; 
    } 
    public static Object Deserialize(MemoryStream stream) 
    { 

     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.AssemblyFormat = FormatterAssemblyStyle.Simple; 
     return formatter.Deserialize(stream); 

    } 

기본적으로 당신은 당신이 당신이 가진 수있는 ID의의를 업데이트해야 할 것, 이것은 당신에게 당신의 그래프의 깊은 사본을 줄 것이다 직렬화에게 다음 역 직렬화 메소드를 호출합니다.

주의 할 점은, nHibernates의 게으른 로딩 기능과 어떻게 관련이 있을지 모르겠습니다. 나는 이것을 많이 했지 만 nHibernate에서 가져온 객체가 아닙니다. 또한 객체에 Serializable을 넣는 것을 잊지 마십시오.

+0

System.Runtime.Serialization.SerializationException : 'NHibernate, 버전 = 1.2.1.4000, Culture = neutral, PublicKeyToken = aa95f207798dfdb4'어셈블리의 'NHibernate.Cfg.Configuration'이 (가) 직렬화 가능으로 표시되어 있지 않습니다. 나는 이것을 직렬화 가능으로 표시 할 수 없습니까? –

+0

아니 겠지요, 당신의 객체는 그것에 대한 참조가 없거나 Session이나 SessionFactory가 그것들입니까? – JoshBerke

+0

몇 가지 정적 메소드가 있습니다. 나는 예를 들어 manager.create (newManager)를 가지고있다. repo 패턴을 사용하고 내 엔티티에서 ref_hibernate를 중지해야한다고 말할 것 같습니까? –

관련 문제