返回重复行的NHibernate
NHibernate似乎多次返回第一行的内容。数据库中存在实际的、不同的行的次数。例如,如果一个人有3个校园附属机构,如下所示:返回重复行的NHibernate,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,NHibernate似乎多次返回第一行的内容。数据库中存在实际的、不同的行的次数。例如,如果一个人有3个校园附属机构,如下所示: @foreach(var campus in Model.Campuses) { @campus.Name @campus.Affiliation } 贝克学院-教师 布莱恩特小学教师 俄亥俄州立大学-学生 NHibernate将按如下方式返回: @foreach(var campus in Model.Campuses) { @campus.Nam
@foreach(var campus in Model.Campuses)
{
@campus.Name @campus.Affiliation
}
贝克学院-教师布莱恩特小学教师
俄亥俄州立大学-学生 NHibernate将按如下方式返回:
@foreach(var campus in Model.Campuses)
{
@campus.Name @campus.Affiliation
}
贝克学院-教师贝克学院-教师
贝克学院-教师 我用的是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或Razor的愚蠢错误,并得到了相同的结果:
public virtual string campusesToString
{
get
{
string s = "";
for (int i = 0; i < Campuses.Count; i++)
{
s = s + Campuses.ElementAt(i).Name + " ";
}
return s;
}
}
公共虚拟字符串campusesToString
{
得到
{
字符串s=“”;
for(int i=0;i
最后,我检查了正在输出的SQL,它是正确的,并且它唯一地返回所有行…您的映射看起来有点奇怪 首先设置此关系:
Person 1->*校园
但是在校园映射中,您使用SysId主键,但它也是Person的外键?我想这就是使NHibernate困惑的地方
我认为NHibernate会多次看到同一个SysId键,因为它会为同一个主键解析同一个对象以保持对象的一致性,所以它会多次返回同一个校园对象,即使其他列具有不同的数据
您可能希望使用多对多映射,否则每个校园将只能有一个人,这似乎是错误的 好的。我发现了我的问题。我在映射中指示的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);
}
+1我同意,我还认为映射需要是多对多映射,否则每个校园只能有一个人(现在看起来,外键列将在校园表中结束,即使给定的名称与主键列不冲突)是的,我也是这么认为的。我会把它添加到答案中,这是一种校园关系。因此,在数据库中,它有一个标识人员的sysid、一个标识人员与校园关系的字段以及校园的名称。(不是我设计的)。person映射中有很多(x=>x.Campus)不是意味着这样的关系:person 1->*Campus吗?