NHibernate似乎多次返回第一行的内容。多次,因为数据库中存在实际的不同行。例如,如果一个人有3个这样的校园关系:
贝克学院 - 老师
布莱恩特小学 - 老师
俄亥俄州立大学 - 学生
NHibernate会像这样返回它:
贝克学院 - 老师
贝克学院 - 老师
贝克学院 - 老师
我正在使用FluentNHibernate。以下是实体和映射文件的一些片段:
public class Person
{
public virtual string SysID { get; set; }
public virtual string FullName { get; set; }
public virtual ICollection<Campus> Campuses { get; set; }
}
public class Campus
{
public virtual string SysID { get; set; }
public virtual string Name { get; set; }
public virtual string Affiliation { get; set; }
}
public class PersonMapping
{
Table("Person");
Id(x => x.SysId);
Map(x => x.FullName).Column("FULL_NAME");
HasMany(x => x.Campuses).KeyColumn("SysId");
}
public class CampusMapping
{
Table("Campus");
Id(x => x.SysID);
Map(x => x.Name);
Map(x => x.Affiliation);
}
我正在我的视野中重复校园(MVC 3):
@foreach(var campus in Model.Campuses)
{
@campus.Name @campus.Affiliation
}
我也尝试将其添加到实体中,以确保它与MVC或Razor不是一个愚蠢的错误并且具有相同的结果:
public virtual string campusesToString
{
get
{
string s = "";
for (int i = 0; i < Campuses.Count; i++)
{
s = s + Campuses.ElementAt(i).Name + " ";
}
return s;
}
}
最后,我检查了正在输出的SQL,它是正确的,并且它将唯一地返回所有行...
答案 0 :(得分:4)
你的映射看起来有点奇怪。
首先设置此关系:Person 1 -> * Campus
但是在您的Campus映射中,您创建了SysId主键,但它也是Person的外键?我认为这就是混淆NHibernate的原因..
我认为发生的是NHibernate多次看到相同的SysId键,因为它会为同一个主键解析相同的对象以保留对象的缩进性,即使其他列有不同,它也会多次返回相同的Campus对象数据。
您可能希望使用多对多映射,否则每个校园只能有一个看似错误的人。
答案 1 :(得分:0)
确定。我发现了我的问题。我在映射中错误地指出了Id。
有一个人和多个校区。人员ID称为SysID。它也是校园里的外键。但是SysID不是校园的唯一ID。 NHibernate很困惑,因为它试图使用校园ID的人员唯一ID。
public class Campus
{
public virtual string CampusID { get; set; }
public virtual string SysID { get; set; }
public virtual string Name { get; set; }
public virtual string Affiliation { get; set; }
}
public class CampusMapping
{
Table("Campus");
Id(x => x.CampusID);
Map(x => x.SysID);
Map(x => x.Name);
Map(x => x.Affiliation);
}