문제

인스턴스의 고유 한 값만으로 example.create ()를 쿼리로 사용하고 싶습니다. 그렇게하려면 매핑 파일 내부에 설정된 고유 키 속성의 값을 찾아야합니다.

  <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'에 속하는지 알아 내기 위해 무엇을해야합니까?

도움이 되었습니까?

해결책

당신은 그것을 조사해야합니다 Nhibernate.Cfg.Configuration 이것을 얻기 위해 대상. 당신은 당신의 issessionfactory 인스턴스를 만들기 위해 이것을 어딘가에 만들었을 것입니다. 이와 같은 것이 효과가있을 수 있습니다.

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. 그리고 그것은 확실히 더 효율적일 수 있습니다! 또한 오류 조건의 트래핑을 수행하지 않습니다 (예 : 잘못된 키 이름을 제공하거나 미달 클래스 유형을 제공하면 충돌합니다).

건배, 존

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top