Свободный NHibernate - ProjectionList - ICriteria возвращает нулевые значения
Я довольно новичок в NHibernate, но я погуглил и не нашел ничего, что могло бы помочь с этой проблемой. Я надеюсь, что вы, ребята, можете! ;) Я меняю имена свойств и методов, потому что этот код является собственностью компании, но в основном это то, что мне нужно, чтобы помочь.
У меня есть следующий сценарий:
Мой домен
public class Structure
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Person Manager { get; set; } //I need to fill here.
//and others
}
Мой класс карты:
public class MapStructure : ClassMap<Structure>
{
public MapStructure()
{
Table("TB_Structure");
Id(x => x.Id).Column("Id").GeneratedBy.Identity();
Map(x => x.Name).Column("Name");
References<Person>(x => x.Manager).Column("PersonId").Fetch.Join().NotFound.Ignore();
//...
}
}
Repository:
public IEnumerable<T> SelectByColumns()
{
ICriteria searchCriteria = _sessao.CreateCriteria<T>("this");
searchCriteria.CreateAlias("this.Manager", "Manager");
//Only for example purpose. Those columns come as an array string parameter, but the treatment is the same one.
var columns = Projections.ProjectionList();
columns.Add(Projections.Property("Manager.Id"));
columns.Add(Projections.Property("Manager.Name"));
columns.Add(Projections.Property("Manager.Document"));
searchCriteria.SetProjection(columns);
searchCriteria.SetResultTransformer(Transformers.AliasToBean<T>());
return searchCriteria.List<T>();
}
И наконец звонок:
public IEnumerable<Person> GetManager()
{
using (IDbSession dbSession = _sessionFactory.Create())
{
try
{
IRepository<Structure> _repository = dbSession.CreateRepository<Structure>();
IEnumerable<Structure> structureList = _repository.SelectByColumns();
var managerList = (from structure in structureList
where structure.Manager != null
select new Person()
{
Id = structure.Manager.Id,
Name = structure.Manager.Name,
Document = structure.Manager.Document
});
return managerList.OrderBy(x => x.Name);
}
catch (Exception)
{
throw;
}
}
}
Это генерирует мне SQL-запрос, как показано ниже:
SELECT manager1_.PersonId as y0_, manager1_.Name as y1_, manager1_.Document as y2_
FROM TB_Structure this_
inner join TB_Person manager1_ on this_.ManagerId=manager1_.PersonId
И это именно то, что мне нужно. Если я выполню этот запрос в студии управления, я получу все результаты, которые ожидаю.
Но когда я достигаю var managerList, в structList все записи возвращаются из sql, но все с нулевыми значениями, как показано ниже:
Я уже пробовал с CreateAlias, CreateCriteria, вернуть IList <>, вернуть IEnumerable. Я уже изменил Transformers.AliasToBean () на Transformers.AliasToEntityMap. Много разных вещей я обнаружил, прибегая к помощи, но я всегда получал один и тот же результат.
Я ценю любую помощь, и спасибо за ваше время!