2011-01-13 70 views
2

一个非常简单的场景。 我有2类:项目数据结构。类项目包含成员列表< DataStructure>。 我的目标是在一次调用中加载一个Project及其所有的DataStructures。NHibernate - 简单连接查询

public class Project 
{ 
    public virtual string Id { get { } set { } } 
    public virtual string Name { get { } set { } } 
    public virtual ISet<DataStructure> DataStructures { get { } set { } } 
} 

public class DataStructure 
{ 
    public virtual string Id { get { } set { } } 
    public virtual string Name { get { } set { } } 
    public virtual string Description { get { } set { } } 
    public virtual Project Project { get { } set { } } 
    public virtual IList<DataField> Fields { get { } set { } } 
} 

注意数据结构还包含数据字段的列表,但我现在不想加载这些权利。

映射在功能NHibernate:

public class ProjectMap : ClassMap<Project> 
{ 
    public ProjectMap() 
    { 
     Table("PROJECTS"); 
     Id(x => x.Pk, "PK"); 
     Map(x => x.Id, "ID"); 
     Map(x => x.Name, "NAME"); 
     HasMany<DataStructure>(x => x.DataStructures).KeyColumn("FK_PROJECT"); 
    } 
} 

public class DataStructureMap : ClassMap<DataStructure> 
{ 
    public DataStructureMap() 
    { 
     Table("DATA_STRUCTURES"); 
     Map(x => x.Id, "ID"); 
     Map(x => x.Name, "NAME"); 
     Map(x => x.Description, "DESCRIPTION"); 
     References<Project>(x => x.Project, "FK_PROJECT"); 
     HasMany<DataField>(x => x.Fields).KeyColumn("FK_DATA_STRUCTURE"); 
    } 
} 

这是我的查询:

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

结果是这样的例外:

NHibernate.Hql.Ast.ANTLR.SemanticException: Path expected for join! [from Themis.DataEntities.Project left join DataStructure] 

我需要指定现场加入?这不是从映射推断出来的吗?

注1 - 表项目包含单个项目行,所以没有必要搜索特定的一个。

注2 - 我通过成功加载项目证实我的NHibernate设置是正确的。

回答

2

对于任何人谁是有兴趣的,我发现在nhusers了答案:

IQuery query = session.CreateQuery("from Project as pr left join pr.DataStructures") 
1

您的查询应为"from Project left join Project.Fields"。 NH希望看到的路径是Project.DataStructures。请记住它是面向对象的,而不是面向表的,因此大部分时间甚至是查询都在对象上进行操作。

+0

很好的回答,但我想你的意思`Project.DataStructures`,这要是我有代表我会纠正你。 – ChrisAnnODell 2011-01-13 23:23:29