2010-03-05 3 views
4

Fluent NHibernate를 사용하고 클래스를 자동 매핑합니다. Fluent NHibernate 및 계산 된 속성

나는이 속성의 나머지 부분과 매핑되지 않은

public virtual DateTime? LastActionTimeStamp 
{ 
    get { 
     return Actions.Count == 0 ? null : Actions.OrderByDescending(
      a => a.TimeStamp).ElementAt(0).TimeStamp; 
    } 
} 

의 라인을 따라 클래스에서 계산 된 속성을, 그래서 나는 ICriteria 제한에서 사용할 수 없었다.

could not execute query ... Invalid column name 'LastActionTimeStamp'.

그래서 내 질문은 : 어떻게 내가 (내가 어딘가에 읽을 때 이렇게하면 그것을 수행하는 매핑에 포함 할 것을) 나는,하지만 지금은 NHibernate에 오류를 받고 있어요 빈 세터를 추가 Fluent NHibernate에게 NHibernate에게이 프로퍼티에 대한 데이터베이스를 무시하도록 알려주지 만 여전히 get 프로퍼티에서 계산 된 값을 리턴 할 것인가?

답변

2

당신은 재산과 사용에 수식을 연결할 수있는 대신 C# 코드의. 예 :

재산권 :

private int _postCount = 0; 
public virtual int PostCount 
{ 
    get 
    { 
     return _postCount; 
    } 
} 

공식 :

(SELECT count(p.ID) FROM BlogPost p WHERE p.BlogID = ID and p.IsDeleted = 0) 

그리고 당신이 평소와 같이 표현에 PostCount를 사용할 수 있습니다. FluentMapping의 속성에서 액세스 한정자를 설정해야합니다. 유창함 지원하지만 일반 매핑 발견 한 옵션이 확실하지 무엇 :

* property 
* field 
* field.camelcase 
* field.camelcase-underscore 
* field.pascalcase-m-underscore 
* field.lowercase-underscore 
* nosetter.camelcase 
* nosetter.camelcase-underscore 
* nosetter.pascalcase-m-underscore 
* nosetter.lowercase-underscore 

아마 최고의 그래서 당신은 예를 들어, 네이밍 전략과 접근 전략을 결합 공식 목록 Access Strategies에 대한 NHibernate에 문서를 체크 아웃 "field.lowercase 밑줄"

1

당신이 NHibernate로 그렇게 할 수있을지는 확신 할 수 없지만 틀릴 수도 있습니다. NHibernate는 당신의 기준을 SQL로 변환 시키므로이 속성은 쿼리 할 수 ​​없습니다 (db에 없다!).

그러나 내가 틀렸다면 (자주 발생하는 경우) 오버라이드로 매핑 할 수 있어야합니다.

자동 설정에서 override을 만들고이 속성을 명시 적으로 매핑하여 Access 속성을 사용하여 NHibernate에 처리 방법을 알려줍니다. 이 같은

뭔가 :

AutoMap.AssemblyOf<YourEntity>() 
    // automapping stuff 
    .Override<ThatClass>(m => 
    { 
    m.Map(x => x.LastActionTimeStamp) 
     .Access.None(); 
    }); 
1

또한 매핑을 무시하고 때에 프로퍼티 무시할 수 있습니다 :

public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass> 
{ 
    public void Override(AutoMapping<ThatClass> mapping) 
     { 
      mapping.IgnoreProperty(x=> x.PropertyToIgnore); 
     } 
}