고유 한 키 값으로 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
이것을 얻기 위해 대상. 당신은 당신의 issessionfactory 인스턴스를 만들기 위해 이것을 어딘가에 만들었을 것입니다. 이와 같은 것이 효과가있을 수 있습니다.
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. 그리고 그것은 확실히 더 효율적일 수 있습니다! 또한 오류 조건의 트래핑을 수행하지 않습니다 (예 : 잘못된 키 이름을 제공하거나 미달 클래스 유형을 제공하면 충돌합니다).
건배, 존
제휴하지 않습니다 StackOverflow