C# NHibernate-扁平收集

C# NHibernate-扁平收集,c#,nhibernate,nhibernate-mapping,queryover,C#,Nhibernate,Nhibernate Mapping,Queryover,我有一个包含集合的对象: public class Teacher { public virtual string Name {get;set;} public virtual ISet<Student> Students {get;set;} // ... } public class Student { public virtual string LastName {get;set;} // ... } 映射配置为: <clas

我有一个包含集合的对象:

public class Teacher
{
    public virtual string Name {get;set;}
    public virtual ISet<Student> Students {get;set;}
    // ...
}

public class Student
{
    public virtual string LastName {get;set;}
    // ... 
}
映射配置为:

<class table="Teacher" name="...">
    <id name="Id" ... />
    <property name="Name" column="Name" />
    <set name="Students" table="Student" inverse="true">
        <key column="TeacherId" />
        <one-to-many class="Student" />
    </set>
</class>
<class table="Teacher" name="...">
    <id name="Id" ... />
    <property name="Name" column="Name" />
    <join table="Student" fetch="join">
        <key column="TeacherId" />
        <property name="LastName" column="LastName" />
    </join>
</class>
通过将此新类用于DetachedCriteria,我收到了正确数量的项,但它们没有正确填充:

Name='X',LastName='A' Name='X',LastName='A' Name='X',LastName='A' 而不是:

Name='X',LastName='A' Name='X',LastName='B' Name='X',LastName='C'
我是否遗漏了映射配置中的某些内容?

我不知道如何正确调整标准NHibernate的使用-如上所述。但我可以告诉大家,我希望其他人也会这样做

ORM的基础是双向映射。它在DB中是双向的,因此也应该在C中:

// as is
public class Teacher
{
    public virtual ISet<Student> Students {get;set;}
    // ...
}

// has reference to Teacher
public class Student
{
    public virtual Teacher Teacher {get;set;}
    // ... 
}
查询:现在我们可以使用简单的查询-从学生方面:

// aliasing to support type safe access to properties
Teacher teacher = null;
Student student = null;
TeacherWithFlattenCollection dto = null;

// now we query from Student side, to get proper data    
var query = session.QueryOver<Student>(() => student)
    .JoinAlias(x => x.Teacher, () => teacher)
    .Where(...)
    .SelectList(list => list
           .Select(x => x.LastName)    .WithAlias(() => dto.LastName)
           .Select(x => x.Teacher.Name).WithAlias(() => dto.Name)
    )
    .TransformUsing(Transformers.AliasToBean<TeacherWithFlattenCollection >())

注意:我们不需要像上面那样使用DTO,请检查如何使用一点-在这里阅读更多:

我没有答案如何正确调整标准NHibernate使用-如上所述。但我可以告诉大家,我希望其他人也会这样做

ORM的基础是双向映射。它在DB中是双向的,因此也应该在C中:

// as is
public class Teacher
{
    public virtual ISet<Student> Students {get;set;}
    // ...
}

// has reference to Teacher
public class Student
{
    public virtual Teacher Teacher {get;set;}
    // ... 
}
查询:现在我们可以使用简单的查询-从学生方面:

// aliasing to support type safe access to properties
Teacher teacher = null;
Student student = null;
TeacherWithFlattenCollection dto = null;

// now we query from Student side, to get proper data    
var query = session.QueryOver<Student>(() => student)
    .JoinAlias(x => x.Teacher, () => teacher)
    .Where(...)
    .SelectList(list => list
           .Select(x => x.LastName)    .WithAlias(() => dto.LastName)
           .Select(x => x.Teacher.Name).WithAlias(() => dto.Name)
    )
    .TransformUsing(Transformers.AliasToBean<TeacherWithFlattenCollection >())

注意:我们不需要像上面那样使用DTO,检查如何使用一点-在这里阅读更多内容:

我已经完成了双重映射,SQL查询在SQL Server Management Studio中生成了正确的结果,返回了3行3个不同的学生。问题更多的是如何填充对象。我将尝试使用Transformers。我已经完成了双重映射,SQL查询在SQLServerManagementStudio中生成了正确的结果,返回了3行3个不同的学生。问题更多的是如何填充对象。我要试试变形金刚。
// aliasing to support type safe access to properties
Teacher teacher = null;
Student student = null;
TeacherWithFlattenCollection dto = null;

// now we query from Student side, to get proper data    
var query = session.QueryOver<Student>(() => student)
    .JoinAlias(x => x.Teacher, () => teacher)
    .Where(...)
    .SelectList(list => list
           .Select(x => x.LastName)    .WithAlias(() => dto.LastName)
           .Select(x => x.Teacher.Name).WithAlias(() => dto.Name)
    )
    .TransformUsing(Transformers.AliasToBean<TeacherWithFlattenCollection >())