2011-02-23 75 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); 
}