返回重复行的NHibernate

返回重复行的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

NHibernate似乎多次返回第一行的内容。数据库中存在实际的、不同的行的次数。例如,如果一个人有3个校园附属机构,如下所示:

@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吗?