NHibernate возвращает дубликаты строк - PullRequest
2 голосов
/ 23 февраля 2011

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 ]

4 голосов
/ 23 февраля 2011

Ваше отображение выглядит немного странно.

Сначала вы установили эти отношения: Person 1 -> * Campus

Но в своем отображении Campus вы делаете SysId первичным ключом, но это также внешний ключ для Person? Я думаю, это то, что смущает NHibernate ..

Мне кажется, что NHibernate несколько раз видит один и тот же ключ SysId и, поскольку он будет разрешать один и тот же объект для одного и того же первичного ключа, чтобы сохранить идентичность объекта, он будет возвращать один и тот же объект Campus несколько раз, даже если другие столбцы имеют разные данные.

Возможно, вы захотите использовать сопоставление «многие ко многим», иначе в каждом кампусе будет только один человек, который кажется неправильным.

0 голосов
/ 23 февраля 2011

Хорошо. Я узнал свою проблему. Я указывал идентификатор в отображении неправильно.

Есть один человек и несколько кампусов. Идентификатор человека называется SysID. Это также внешний ключ в кампусе. Но SysID не является уникальным идентификатором для кампуса. NHibernate был сбит с толку, потому что он пытался использовать уникальный идентификатор человека для идентификатора кампуса.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...