كيفية استخدام NHibernate الاستعلام عن طريق القيم فريدة من نوعها مفتاح

StackOverflow https://stackoverflow.com/questions/1420615

سؤال

وأود أن استخدام 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 للحصول على هذا. كنت قد شيدت هذا في مكان ما من أجل إنشاء المثال 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. ويمكن بالتأكيد أن تكون أكثر كفاءة! كما أنها لا تفعل أي محاصرة من حالات الخطأ (على سبيل المثال، إذا كنت تعطيه اسم المفتاح غير صحيح، أو نوع فئة تفاصيلها بعد ذلك سوف تحطم).

وابتهاج، جون

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top