NHibernate AliasToBean трансформаторные ассоциации

Я пытаюсь использовать следующий оператор для получения сущности с полями, которые я им:

retVal = session.CreateCriteria(typeof(MyEntity)) .CreateAlias("MyEntityProperty", "MyEntityProperty") .Add(Restrictions.Eq("MyEntityProperty.Year", year)) .SetProjection( Projections.Distinct( Projections.ProjectionList() .Add(Projections.Property("Property1"), "Property1") .Add(Projections.Property("Property2"), "Property2") .Add(Projections.Property("MyEntityProperty.RegisteredUser"), "MyEntityProperty.RegisteredUser") .Add(Projections.Property("MyEntityProperty.CompanyInfo"), "MyEntityProperty.CompanyInfo") ) ) .SetResultTransformer(Transformers.AliasToBean(typeof(MyEntity))) .List() .Cast(); 

MyEntity – это объект, который я хочу вернуть, а MyEntityProperty – это свойство MyEntity, которое является другим объектом (типа MyEntityProperty).

Ошибка, которую я получаю: Could not find a setter for property 'MyEntityProperty.RegisteredUser' in class 'MyEntity'

Является ли трансформатор AliasToBean не способным обрабатывать сущности? Или есть что-то еще, что мне нужно сделать, чтобы оно работало?

Есть мой мастерский кусок … который я использую для преобразования любого уровня глубины проекций. Возьмите его и используйте его так:

 .SetResultTransformer(new DeepTransformer()) 

Он может использоваться для любых свойств ValueType , ссылок « many-to-one а также для динамических объектов …

 public class DeepTransformer : IResultTransformer where TEntity : class { // rows iterator public object TransformTuple(object[] tuple, string[] aliases) { var list = new List(aliases); var propertyAliases = new List(list); var complexAliases = new List(); for(var i = 0; i < list.Count; i++) { var aliase = list[i]; // Aliase with the '.' represents complex IPersistentEntity chain if (aliase.Contains('.')) { complexAliases.Add(aliase); propertyAliases[i] = null; } } // be smart use what is already available // the standard properties string, valueTypes var result = Transformers .AliasToBean() .TransformTuple(tuple, propertyAliases.ToArray()); TransformPersistentChain(tuple, complexAliases, result, list); return result; } /// Iterates the Path Client.Address.City.Code  protected virtual void TransformPersistentChain(object[] tuple , List complexAliases, object result, List list) { var entity = result as TEntity; foreach (var aliase in complexAliases) { // the value in a tuple by index of current Aliase var index = list.IndexOf(aliase); var value = tuple[index]; if (value.IsNull()) { continue; } // split the Path into separated parts var parts = aliase.Split('.'); var name = parts[0]; var propertyInfo = entity.GetType() .GetProperty(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); object currentObject = entity; var current = 1; while (current < parts.Length) { name = parts[current]; object instance = propertyInfo.GetValue(currentObject); if (instance.IsNull()) { instance = Activator.CreateInstance(propertyInfo.PropertyType); propertyInfo.SetValue(currentObject, instance); } propertyInfo = propertyInfo.PropertyType.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); currentObject = instance; current++; } // even dynamic objects could be injected this way var dictionary = currentObject as IDictionary; if (dictionary.Is()) { dictionary[name] = value; } else { propertyInfo.SetValue(currentObject, value); } } } // convert to DISTINCT list with populated Fields public System.Collections.IList TransformList(System.Collections.IList collection) { var results = Transformers.AliasToBean().TransformList(collection); return results; } } 

Ну, я не делал вещи сложнее, чем нужно.

Вместо того, чтобы пытаться установить поля в сущности, все, что мне нужно было сделать, это ссылка на поле объекта:

 .Add(Projections.Property("MyEntityProperty"), "MyEntityProperty") 

и nHibernate заселил его в порядке.

Но я рад, что спросил, потому что у меня очень полезный код Радима 🙂

Давайте будем гением компьютера.