2011-02-23 77 views
2

NHibernate似乎多次返回第一行的内容。与数据库中实际不同的行数一样多。例如,如果一个人有3点校区的隶属关系是这样的:NHibernate返回重复行

贝克学院 - 教师
科比小学 - 教师
俄亥俄州立大学 - 学生

NHibernate的将返回这样的:

贝克学院 - 教师
贝克学院 - 教师
贝克学院 - 教师

我USI ng 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或剃刀和有同样的结果:

public virtual string campusesToString 
{ 
    get 
    { 
     string s = ""; 

     for (int i = 0; i < Campuses.Count; i++) 
     { 
      s = s + Campuses.ElementAt(i).Name + " "; 
     } 

     return s; 
    } 
} 

最后,我查了一下,目前正在输出的SQL,这是正确的,它的返回所有行联合国不过...

回答

4

你的映射看起来有点奇怪。

首先,建立这种关系:Person 1 -> * Campus

但在校园的映射你让SYSID主键,但它也是外键的人吗?我认为这是什么混淆NHibernate ..

我认为发生的事情是,NHibernate多次看到相同的SysId键,因为它将解析相同的对象为相同的主键来保存对象的缩进它将返回相同的校园对象多次,即使其他列有不同的数据。

您可能想要使用多对多的映射,否则每个校园将只能有一个看起来不对的人。

+0

+1我同意,我也觉得映射需要一个多到多映射,否则每个校区只能有一个人(因为它看起来现在的外键列将在最终即使给出了一个与主键列不冲突的名字,校园表也是如此) – Yhrn 2011-02-23 16:04:26

+0

是的,那也是我的想法。我会将其添加到答案中。 – 2011-02-23 16:07:14

+0

这是校园关系。所以,在db中,它有一个识别人的sysid,一个识别人与校园的关系的领域,以及校园的名字。 (我没有设计它)。 – 2011-02-23 16:20:46

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); 
}