5

私は春と流暢NHibernateは(NHIB 3.1)を搭載しています。このASP.NET MVC3コードを持っては、プロパティを解決できませんでした:のUser.Full_Name:Harrods.Core.Entities.Teacher

私はこのエラーがあります:

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 

この問題がから来ているように見えるということですコード:

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>(); 

私の先生のクラスは次のようになります

[Serializable] 
public class Teacher 
{ 

    public virtual User User { get; set; } 
} 

そして、私のUserクラスは次のようなものになります。問題を与えているもの

public class User : BaseEntity<User> 
{ 

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

わからないが。すべて私には大丈夫です。誰でも何が間違っている? :)

わからないが、彼らはやや似てますが、本当にとにかく解決する方法を理解していない:

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

EDIT: はこれを試みたが、まだ同じエラーを与えます: -

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>(); 

しようとしましたエイリアスだけでなく..:

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>(); 

どちらの作業!

EDIT 2

SQLコードが正しく示されています。 NHibernate Profilerでこれを確認できます。しかし、データがロードされた後、何らかの理由で、それはエラーをポップし、トランザクションはロールバックされます。今では、これはちょうどqueryoverについてもはやであるように私には思いませんか?

答えて

4

あなたが求めているものを達成するためにJoinQueryOverまたはJoinAliasを使用する必要があります。

What is the difference between JoinQueryOver and JoinAlias?

この記事のセクションAssociationsAliasesを見てみましょう:http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx

+0

これは私が試したものですが、働いていないリットル、私は何か間違ったことを書いたなら、私を修正しません。.. :) リターンsession.QueryOver () .JoinQueryOver (U => u.User).Where(X => x.Full_Name.IsInsensitiveLike(」 %」+ FullNameSearchFilter + "%")) .OrderBy(X => x.Id).ASC .SKIP((スキップ - 1)*テイク)を 。テイク(テイク) .List (); – RicL

+0

いずれの方法も機能しません。 ://JoinQueryOverとJoinAliasの両方が同じ正確なエラーを返します。 – RicL

+1

'Full_Name'は' User'のマッピングされた列ですか?また、「MasterLicensee」とは何ですか? 'MasterLicensee'の代わりに' Teachers'のリストを返すべきではありませんか? –

2

これは私の仕事:

SQLをプロデュース
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 

を(私はテストのためにSQL-CEを使用しています):

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)] 
+0

SQLコードが正しく表示されています。 NHibernate Profilerでこれを確認できます。しかし、データがロードされた後、何らかの理由で、それはエラーをポップし、トランザクションはロールバックされます。今では、これはちょうどqueryoverについてもはやであるように私には思いませんか? – RicL

+0

ソリューションも機能します!ありがとう! – RicL

関連する問題