Как использовать NHibernate для запроса по значениям уникального ключа - PullRequest
1 голос
/ 14 сентября 2009

Я бы хотел использовать 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?

1 Ответ

0 голосов
/ 15 сентября 2009

Вам нужно будет исследовать объект 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...