2012-04-23 3 views
2

매 P 초마다 업데이트되는 POCO가 있습니다. 문제는 마지막 업데이트 이후 모든 속성이 변경되지 않았을 수 있다는 것입니다.속성 값이 POCO에서 변경되었는지 확인

변경 사항을 기록 할 수 있도록 마지막 업데이트 이후에 어떤 속성이 변경되었는지 알아야합니다. 이전 업데이트에서 POCO 복사본을 유지하고 매번 비교를 수행 한 다음 각 속성 변경에 대해 이벤트를 실행하여이 작업을 수행 할 수있었습니다.

누구나 여기에서 사용할 수있는 더 좋은 해결책이 있습니까?

+0

개체 (ADO, EF, NHibernate)를 업데이트하는 데 사용 하시겠습니까? –

+1

각 변경 사항에 대해 POCO의 전체 세부 정보 만 기록 할 수 있습니까? – Oded

+0

@Oded - 가능하지만 많은 양의 데이터를 로깅 할 것이고 복제본은 피할 수있는 저장 공간을 상당히 증가시킬 것입니다. – Mattl

답변

2
  • http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx 이것은 데이터 바인딩과 함께 좋은 재생 방식입니다.

  • 업데이트를 수행 할 때마다 각 속성의 상태를 "이전 값"으로 저장하는 것은 지난 시간과 실제로 다른 값을 가진 속성 만 검색하려는 경우에 필요합니다. 예를 들어, 마지막 업데이트 이후 5에서 3으로 7에서 5로 변경된 속성을 원합니다.

  • 이 구분을 신경 쓰지 않고 propertychanged를 사용하지 않으려는 경우 setter에서 각 속성에 true로 설정된 부울 값을 부여하고 업데이트 할 때마다 false로 설정할 수 있습니다 .

  • 당신은 GetProperty/SetProperty 메카닉을 만들 수 있습니다 - 당신은 setters/getters에서이 함수들을 호출 할 수 있습니다. 그리고 실제 데이터와 그에 관한 메타 데이터를 원하는 방식으로 저장할 수 있습니다. 그러나 이것은 더 이상 POCO가 아닙니다.

0

내가 아는 한 클래스의 속성 변경을 추적하기 위해 .NET에는 "기본 제공"기능이 없습니다. 그러나 다음 중 하나라도 작동해야합니다.

1) 변경 사항을 추적하기 위해 각 속성의 설정자에 코드를 수동으로 작성합니다.

2) '이전'복사본과 '업데이트 된'인스턴스를 비교하는 코드를 작성하십시오 (원래 게시물에서 말한 것과 같은).

3) AOP 프레임 워크 (예 : PostSharp)를 사용하여 각 속성에 일종의 업데이트 알림을 추가하십시오.

2

정말로 POCO라면 아니요, 사본을 보관해야합니다. IsDirty 플래그를 POCO에 추가하려는 경우 속성이 변경 될 때 설정할 수 있습니다. 이러한 객체는 속성이 변경 한 후 원래 값으로 다시 변경이있는 경우는 DirtyFlag가 여전히 설정 될 것이라고

class POCO 
{ 
[Flags] 
enum POCOFieldsEnum 
{ 
    Property1 = 0x01; 
    Property2 = 0x02; 
} 

private String _Property1; 
public String Property1 
{ 
    get { return _Property1; } 
    set 
    { 
    if (value.Equals(_Property1)) return; 
    _Property1 = value; 
    DirtyFlags |= POCOFieldsEnum.Property1; 
    } 
} 

private String _Property2; 
public String Property2 
{ 
    get { return _Property2; } 
    set 
    { 
    if (value.Equals(_Property2)) return; 
    _Property2 = value; 
    DirtyFlags |= POCOFieldsEnum.Property2; 
    } 
} 

POCOFieldsEnum DirtyFlags { private set; public get; } 
} 

참고 :이 속성이 변경 된 알 수 있도록 당신은 비트 필드 IsDirty 사용 플래그를 만들 수 있습니다. 이 상황을 방지하려면 속성 설정자에서 비교할 속성의 원래 값 (또는 해시 값)을 저장해야합니다.

0

다양한 속성의 해시를 만들고 속성 자체로 저장 한 다음 확인하는 동안 다시 비교하십시오.

관련 문제