Frage

Ich möchte Example.Create () verwenden, nur durch die einzigartigen Werte einer Instanz abzufragen. Um dies zu tun muss ich den Wert der einzigartigen-Schlüsseleigenschaft herauszufinden, die innerhalb der Mapping-Datei festgelegt worden war, wie folgt:

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

Zum besseren Verständnis - hier ist der wichtige Teil des Codes:

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
}

Was muss ich tun, tun, um herauszufinden, ob eine Eigenschaft der einzigartigen Schlüsselgruppe gehört ‚MyUniqueKeyGroup‘?

War es hilfreich?

Lösung

Sie müssen das Nhibernate.Cfg.Configuration Objekt untersuchen diese zu erhalten. Sie hätten diese irgendwo gebaut, um Ihre ISessionFactory Instanz zu erstellen. So etwas wie dies funktionieren kann:

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

Ich habe nicht wirklich kompiliert dies funktioniert es zu überprüfen, so YMMV. Und es könnte sicherlich effizienter gemacht werden! Es macht auch kein Abfangen von Fehlerbedingungen (zum Beispiel, wenn Sie ihm einen falschen Schlüssel Namen geben, oder ein nicht zugeordnete Klassentyp, dann wird es zum Absturz bringen).

Cheers, John

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top