2010-12-31 23 views
1

最も基本的なクエリを行うマッピング例外が発生します。 これは私のドメインクラスである:クエリでNHibernate例外が発生する

public class Project 
{ 
    public virtual string PK { get; set; } 
    public virtual string Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
} 

とマッピングクラス:

public class ProjectMap :ClassMap<Project> 
{ 
    public ProjectMap() 
    { 
     Table("PROJECTS"); 
     Id(x => x.PK, "PK"); 
     Map(x => x.Id, "ID"); 
     Map(x => x.Name, "NAME"); 
     Map(x => x.Description, "DESCRIPTION"); 
    } 
} 

構成:

public ISessionFactory SessionFactory 
{ 
    return Fluently.Configure() 
     .Database(MsSqlCeConfiguration.Standard.ShowSql().ConnectionString(c => c.Is("data source=" + path))) 
     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Project>()) 
     .BuildSessionFactory(); 

} 

と問合せ: のIListプロジェクト。

using (ISession session = SessionFactory.OpenSession()) 
{ 
    IQuery query = session.CreateQuery("from Project"); 
    project = query.List<Project>(); 
} 

私は、クエリライン上の例外を取得しています:

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException: Project is not mapped [from Project] 
    at NHibernate.Hql.Ast.ANTLR.SessionFactoryHelperExtensions.RequireClassPersister(String name) 
    at NHibernate.Hql.Ast.ANTLR.Tree.FromElementFactory.AddFromElement() 
    at NHibernate.Hql.Ast.ANTLR.Tree.FromClause.AddFromElement(String path, IASTNode alias) 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromElement() 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromElementList() 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromClause() 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.unionedQuery() 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.query() 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.selectStatement() 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.statement() 
    at NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate() 
    at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Analyze(HqlParseEngine parser, String collectionRole) 
    at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole) 
    at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary`2 replacements, Boolean shallow) 
    at NHibernate.Engine.Query.HQLQueryPlan..ctor(String hql, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) 
    at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(String queryString, Boolean shallow, IDictionary`2 enabledFilters) 
    at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(String query, Boolean shallow) 
    at NHibernate.Impl.AbstractSessionImpl.CreateQuery(String queryString) 

私は何かが私のクエリが間違っていると仮定します。

+0

ProjectMapクラスはProjectクラスと同じアセンブリにありますか? – Vadim

+0

トピックを外していますが、PKとIDの違いは何ですか? – Phill

+0

いいえProjectMapクラスはDatabaseServerアセンブリにあります。プロジェクトクラスはドメインアセンブリ内にあります。 DatabaseServerアセンブリには、ドメインアセンブリへの参照があります。 – Yoav

答えて

5

問題は、エンティティがどこにあるのではなく、マッピングファイルがあるアセンブリを指定する必要があるということです。

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ProjectMap>()) 
+0

ありがとうございました。 ProjectMapが参照された場所が不思議でした。 BTW - これは、各ClassMapに行を追加する必要があることを意味します。一度十分です(すべてのClassMapsが同じassemplyにあります)。 – Yoav

+0

@ Yoav、AddFromAssemblyOfメソッドはすべてのClassMapsを一度にマップします。 – Roman

0

まず、マッピングクラスが実際に実行されていることを確認します。これを行うには、ProjectMapクラスの中にブレークポイントを配置してデバッグして、ブレークポイントが確実に実行されるようにします。

using (ISession Session = SessionFactory.OpenSession()) 
{ 
    DetachedCriteria Filter = DetachedCriteria.For<Project>(); 
    var Projects = Filter.GetExecutableCriteria(Session).List<Project>(); 
} 

あなたのクエリは、私はHQLを知っている必要はありませんので、私は通常、クエリにDetachedCriteriaをを使用して...綴らをお見逃しなくされていることを確認するためにDetachedCriteriaをを使用してみてください。

+0

DetachedCriteriaと定期的なCriteriaを使用する理由は何ですか? – Vadim

+0

DetachedCriteriaに使用するネームスペースを教えてください。 – Yoav

+0

NHibernate.Criterionから来ます。私はそれがよく知られているAPIと使いやすいことを除いて、それを使用する特別な理由はありません。また、セッションなしで作成することもできますので、実際はICriteriaインターフェイスのラッパーです。 – Roman

関連する問題