Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 683
RicL Avatar asked Nov 05 '11 16:11

RicL


2 Answers

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

like image 136
Cole W Avatar answered Nov 15 '22 22:11

Cole W


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)]
like image 2
VahidN Avatar answered Nov 16 '22 00:11

VahidN