2010-12-31 6 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>(); 
} 

은 ... 당신의 쿼리가 철자가 그리워되지 않도록하기 위해 DetachedCriteria를 사용해보십시오 나는 보통 나는이 HQL을 알 필요가 없기 때문에 쿼리에 대한 DetachedCriteria를 사용합니다.

+0

DetachedCriteria를 사용하는 이유와 정기적 인 기준을 비교하는 이유는 무엇입니까? – Vadim

+0

DetachedCriteria에 사용할 네임 스페이스를 알려주시겠습니까? – Yoav

+0

NHibernate.Criterion에서 온다. 나는 잘 알려진 API이고 사용하기 쉽다는 것 외에는 특별한 이유가 없다. 또한 세션없이 만들 수 있기 때문에 현실에서는 ICriteria 인터페이스를 감싸는 래퍼 일뿐입니다. – Roman