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