2011-12-22 10 views
0

경우에 따라 실제적인 이유로 "후행 재산"이 필요한 재산이 있습니다. 예를 들어백업 속성의 이름을 지정하고 매핑하는 방법은 무엇입니까?

, 나는 이름 속성이 하나 개의 유형이 - 액세스에서 발생하는 가치에는 변화가 없기를, 그것은 단지 어떤 종류의 작업을 실행; 당신이 원한다면, 부작용. (이 토론을 위해 중요하지,하지만 변경하면이 특별한 경우에, 이름은 다른 곳에 복사됩니다.)

의가 있다고 가정 해 봅시다 :

public class Person 
{ 
    private string __name; 

    protected internal virtual string _name 
    { 
     get 
     { 
      return this.__name; 
     } 
     set 
     { 
      this.__name = value; 
     } 
    } 

    public virtual string Name 
    { 
     get 
     { 
      return _name; 
     } 

     set 
     { 
      _name = value; 

      // action when changing the name takes place here... 
     } 
    } 
} 

그래서 "_name"속성에 매핑 데이터베이스는 보호하지만 내부적으로 보호되어 있으므로 직접 수정할 수 없습니다. 두 번째 공용 속성 인 "이름"은 실제 액세스 권한을 제공합니다.

내가이 방법으로 설정 한 이유는 매핑 된 "_name"속성의 set-method에 해당 동작이 직접 작성 되었기 때문에 개체가 데이터베이스에서 수화되었을 때 트리거되기 때문입니다. 내가 원하는.

이렇게 모두 정상적으로 작동합니다.

이 문제는 해당 속성이 매핑되지 않은 당신이이 유형을 조회해야하는 경우, Person.Name를 조회하려고 시도하는 것은 작동하지 않습니다 때문에! 나는 이것에 대해 싫어하는 무엇

, 당신은 Person.Name에 대해 코드를 작성하지만, 오류가 발생하기 쉬운 및 혼란 Person._name, 대한 쿼리를 작성해야하고 있다는 사실이다.

이 문제를 해결하는 더 좋은 방법이 있습니까?

답변

0

매핑에 대한 액세스에 nosetter.camelcase-underscore을 사용할 수 있습니까? 이것은 속성 setter를 사용하는 대신 필드를 직접 설정합니다 (예 : _name과 같이 올바르게 명명 된 경우).

예 :

<property name="Name" column="Name" type="String" access="nosetter.camelcase-underscore"/> 
+0

그래서이 직접 백업 필드를 매핑하고, 같은 속성을 필요로하지 않는다? (재산을 mappping하는 것과 반대로 벌금 또는 다른 부작용이 있습니까?) –

+0

예, 정확하게. 페널티가 없습니다. getters/setter 속성에서 코드의 부작용을 피하기 때문에 정확하게 속성을 매핑하는 기본 방법입니다. – TomMhC

+0

어떻게 아무도 당신에게이 물건을 알려주지 않습니까 ?? :-) ... 고맙습니다! –