Question

J'aimerais utiliser Example.Create () pour interroger uniquement les valeurs uniques d'une instance. Pour ce faire, je dois connaître la valeur de la propriété unique-key qui a été définie dans le fichier de mappage, comme suit:

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

Pour une meilleure compréhension, voici la partie importante du code:

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
}

Que dois-je faire pour savoir si une propriété appartient au groupe de clés uniques "MyUniqueKeyGroup"?

Était-ce utile?

La solution

Vous aurez besoin d'analyser l'objet Nhibernate.Cfg.Configuration pour l'obtenir. Vous l'auriez construit quelque part afin de créer votre instance ISessionFactory. Quelque chose comme ça peut marcher:

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)))
    }
}

Je n’ai pas réellement compilé ceci pour vérifier que cela fonctionne, donc YMMV. Et cela pourrait certainement être rendu plus efficace! En outre, il ne dissimule pas les conditions d'erreur (par exemple, si vous lui attribuez un nom de clé incorrect ou un type de classe non mappé, il se bloque).

Salut, John

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top