NHibernate返回重复的行

时间:2011-02-23 15:47:44

标签: nhibernate fluent-nhibernate

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,它是正确的,并且它将唯一地返回所有行...

2 个答案:

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