5

I have this ASP.NET MVC3 code that's powered by Spring and Fluent NHibernate (NHIB 3.1)

I have this error:

could not resolve property: User.Full_Name of: Harrods.Core.Entities.Teacher

[QueryException: could not resolve property: User.Full_Name of: Harrods.Core.Entities.Teacher]
NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns(String propertyName) +104
NHibernate.Persister.Entity.AbstractPropertyMapping.ToColumns(String alias, String propertyName) +57
NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns(String alias, String propertyName) +100
NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns(String alias, String propertyName) +53
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(ICriteria subcriteria, String propertyName) +184
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria, String propertyName) +134
NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, String propertyName) +45
NHibernate.Criterion.CriterionUtil.GetColumnNames(String propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria, IDictionary`2 enabledFilters) +46
NHibernate.Criterion.InsensitiveLikeExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +101
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) +298
NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary`2 enabledFilters) +447
NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 enabledFilters) +175
NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +412
NHibernate.Impl.CriteriaImpl.List(IList results) +80
NHibernate.Impl.CriteriaImpl.List() +104
NHibernate.Criterion.QueryOver`1.List() +96
NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver<TRoot>.List() +75

This is the code that the problem seems to be coming from:

return session.QueryOver<Teacher>()
                    .Where(x => x.User.Full_Name.IsInsensitiveLike("%" + Search + "%"))
                    .OrderBy(x => x.Id).Asc
                    .Skip((skip - 1) * take)
                    .Take(take)
                    .List<Teacher>();

My Teacher class looks like this:

[Serializable]
public class Teacher
{

    public virtual User User { get; set; }
}

And my User class looks something like this:

public class User : BaseEntity<User>
{

    public virtual string Email { get; set; }
    public virtual string Full_Name { get; set; }
}

Not sure what's giving the problem. Everything looks okay to me. Anyone have any ideas whats wrong? :)

Not sure but they look somewhat similar, but don't really understand how to solve anyway:

NHibernate.QueryException with dynamic-component A correct way to load entities by Id list when Id is not mapped

EDIT: Tried this, but still giving the same error:-

return session.QueryOver<Teacher>()
                    .JoinQueryOver<User>(u => u.User)
                    .Where(x => x.Full_Name.IsInsensitiveLike("%" + FullNameSearchFilter + "%"))
                    .OrderBy(x => x.Id).Asc
                    .Skip((skip - 1) * take)
                    .Take(take)
                    .List<Teacher>();

Tried alias as well..:

return session.QueryOver<Teacher>()
                    .JoinAlias(() => ML.User, () => U)
                    .Where(() => U.Full_Name.IsInsensitiveLike("%" + FullNameSearchFilter + "%"))
                    .OrderBy(x => x.Id).Asc
                    .Skip((skip - 1) * take)
                    .Take(take)
                    .List<Teacher>();

Neither working!

EDIT 2

the sql codes is being showed correctly; I can verify this via my NHibernate Profiler. But for some reason once the data has been loaded, it pops the error and the transaction is rolled back. Now it appears to me that this is no longer just about queryover?

Community
  • 1
  • 1
RicL
  • 533
  • 2
  • 6
  • 24

2 Answers2

4

You'll have to use a JoinQueryOver or JoinAlias to accomplish what you are asking for.

What is the difference between JoinQueryOver and JoinAlias?

Take a look at sections Associations and Aliases in this article: http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx

Community
  • 1
  • 1
Cole W
  • 15,123
  • 6
  • 51
  • 85
  • This is what I tried, but still not working, do correct me if I wrote something wrong.. :) return session.QueryOver() .JoinQueryOver(u => u.User).Where(x => x.Full_Name.IsInsensitiveLike("%" + FullNameSearchFilter + "%")) .OrderBy(x => x.Id).Asc .Skip((skip - 1) * take) .Take(take) .List(); – RicL Nov 05 '11 at 17:11
  • Neither methods work! :/ Both JoinQueryOver and JoinAlias gives the same exact error. – RicL Nov 05 '11 at 17:24
  • 1
    Is `Full_Name` a mapped column in `User`? Also what is `MasterLicensee`? Shouldn't you be returning a list of `Teachers` instead of `MasterLicensee`? – Cole W Nov 05 '11 at 18:22
  • Hi Cole, Sorry, copied wrongly.. Yes it does return .List() and, yes Full_Name is a mapped column in User entity. By the way, I stick with automapping for all the mapping requirements. Full_Name is a general text column. – RicL Nov 05 '11 at 18:59
  • I think I found the problem! Your solutions are correct! I just missed out 1 obvious thing: do the same for the Count of the list! *embarrased* thanks mate! – RicL Nov 06 '11 at 02:02
2

This worked for me:

User userAlias = null;
var list = session.QueryOver<Teacher>()
                  .JoinQueryOver(x => x.User, () => userAlias, JoinType.LeftOuterJoin)
                  .Where(x => x.FullName.IsInsensitiveLike("%" + "test" + "%"))
                  .OrderBy(x => x.Id).Asc
                  .Skip(1)
                  .Take(2)
                  .List(); //Without MasterLicensee

Produced SQL (I'm using SQL-CE for tests):

SELECT
    this_.Id as Id2_1_,
    this_.User_id as User2_2_1_,
    useralias1_.Id as Id3_0_,
    useralias1_.Email as Email3_0_,
    useralias1_.FullName as FullName3_0_
FROM
    "Teacher" this_
left outer join
    "User" useralias1_
        on this_.User_id=useralias1_.Id
WHERE
    lower(useralias1_.FullName) like @p0
ORDER BY
    useralias1_.Id asc;
@p0 = '%test%' [Type: String (0)]
VahidN
  • 18,457
  • 8
  • 73
  • 117
  • the sql code is being showed correctly; I can verify this via my NHibernate Profiler. But for some reason once the data has been loaded, it pops the error and the transaction is rolled back. Now it appears to me that this is no longer just about queryover? – RicL Nov 06 '11 at 01:51