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?
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
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)]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With