2009-09-14 2 views
1

Example.Create()를 사용하여 인스턴스의 고유 한 값으로 쿼리하고 싶습니다. 이를 위해 나는 다음과 같이 매핑 파일 안에 설정했던 고유 키 속성 값을 찾을 필요가 :NHibernate를 사용하여 고유 키 값으로 쿼리하는 방법

<property name="MyColumn"> 
    <column name="MyColumn" unique-key="MyUniqueKeyGroup"/> 
    </property> 

더 나은 이해를 위해 - 여기에 코드의 중요한 부분은 다음과 같습니다

criteria.Add(Example.Create(myObject).SetPropertySelector(new MyPropertySelector())); 

[...] 

public class MyPropertySelector: NHibernate.Criterion.Example.IPropertySelector 
{ 
    #region IPropertySelector Member 

    public bool Include(object propertyValue, string propertyName, IType type) 
    { 
     /* here is where I want to check if the property belongs 
      * to the unique-key group 'MyUniqueKeyGroup' and return true if so 
      */ 
    } 

    #endregion 
} 

속성이 고유 키 그룹 'MyUniqueKeyGroup'에 속하는지 알아 보려면 무엇을해야합니까?

답변

0

이것을 얻으려면 Nhibernate.Cfg.Configuration 개체를 조사해야합니다. 당신은 당신의 ISessionFactory 인스턴스를 생성하기 위해 이것을 어딘가에 만들었을 것입니다. 이 같은 것이 작동 할 수도 있습니다.

private NHibernate.Cfg.Configuration _configuration; 

[...] 

var selector = new MyPropertySelector<MyClass>(_configuration, "MyUniqueKeyGroup"); 
criteria.Add(Example.Create(myObject) 
        .SetPropertySelector(selector)); 

[...] 

public class MyPropertySelector<T>: NHibernate.Criterion.Example.IPropertySelector 
{ 
    private NHibernate.Cfg.Configuration _onfiguration; 
    private IEnumerable<NHibernate.Mapping.Column> _keyColumns; 

    public MyPropertySelector(NHibernate.Cfg.Configuration cfg, string keyName) 
    { 
     _configuration = cfg; 
     _keyColumns = _configuration.GetClassMapping(typeof(T)) 
           .Table 
           .UniqueKeyIterator 
           .First(key => key.Name == keyName) 
           .ColumnIterator); 

    } 

    public bool Include(object propertyValue, string propertyName, IType type) 
    { 
     return _configuration.GetClassMapping(typeof(T)) 
          .Properties 
          .First(prop => prop.Name == propertyName) 
          .ColumnIterator 
           .Where(col => !col.IsFormula) 
           .Cast<NHibernate.Mapping.Column>() 
           .Any(col => _keyColumns.Contains(col))) 
    } 
} 

실제로이 기능을 검사하여 컴파일하지 않았으므로 YMMV가 작동합니다. 그리고 확실히 더 효율적으로 만들 수 있습니다! 또한 오류 조건을 트래핑하지 않습니다 (예 : 잘못된 키 이름을 지정하거나 매핑되지 않은 클래스 유형을 지정하면 충돌합니다).

건배, John

+0

고맙습니다! NHibernate.Cfg.Configuration을 사용하면 필요한 힌트를 얻을 수있었습니다. 나는 원래 SessionFactory.GetClassMetadata() 함수를 사용하여이 문제를 해결할 수 있다고 생각했다. – Martin

관련 문제