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