Свободный NHibernate много к одному проблема сопоставления - PullRequest
0 голосов
/ 09 сентября 2011

Редактировать

У меня есть ответ, и я опубликую его завтра.

У меня есть класс, который использует родительский столбец первичного ключа вместо своего собственного столбца первичного ключа.

Здесь задействованы два класса ActionHistory и ActionData. Родительский класс ActionHistory представляет действие и сведения о том, кто выполнил это действие. Дочерний класс ActionData представляет часть данных, созданную действием. Каждый ActionHistroy имеет несколько ActionData, и они представлены через сопоставление многие-к-одному.

Классы:

public class ActionHistory
{
    public virtual int Code { get; set; } 
    public virtual string Doneby { get; set; }
    public virtual IList<ActionData> _ActionData{ get; set;}
}

public class ActionData
{
    public virtual int Code { get; set; }
    public virtual double Data{ get; set; }
    public virtual ActionHistory _ActionHistory{ get; set; }
}

Мои отображения:

public class ActionHistoryClassMap : ClassMap<ActionHistory>
{
    public ActionHistoryClassMap ()
    {
        Table("ACTIONHISTORY");
        Id(x => x.Code, "CODE").GeneratedBy.Assigned();
        Map(x => x.Doneby, "DONEBY");
        HasMany(x => x._Actiondata).KeyColumn("CODE").AsBag().Cascade.All();
    }
}

public class ActionDataClassMap : ClassMap<ActionData>
{
    public ActionDataClassMap ()
    {
        Table("ACTIONDATA");
        Id(x => x.Code, "CODE").GeneratedBy.Assigned();
        Map(x => x.Data, "DATA");
        References(x => x._ActionHistory, "ACTIONHISTORYID");
    }
}

Проблема в том, что при запросе к классу ActionHistory возвращается верный ActionHistory, но содержащиеся в нем HistoryData неверны. Список HistoryData должен быть возвращен, но возвращается только одна HistoryData, и его значение Code является значениями Code родительского класса ActionHistory. Я полагаю, что мои проблемы связаны с тем, что оба класса имеют одинаковое имя столбца первичного ключа, и я не обращаюсь с этим должным образом Связанные столбцы - это CODE из таблицы ACTIONHISTORY и ACTIONHISTORYID из таблицы ACTIONDATA. База данных исправлена, поэтому я не могу переименовать столбцы. В этом случае данные считываются только из базы данных, но не сохраняются и не обновляются.

Я скачал NHibernate Profiler, чтобы помочь мне с этой проблемой, и нашел в SQL точную точку возникновения проблемы.

Это SQL-запрос, сгенерированный для возврата ActionData (где 18 - первичный ключ ActionHistory):

SELECT actiondat0_.CODE              as CODE1_,
   actiondat0_.CODE              as CODE9_0_,
   actiondat0_.DATA              as DATA9_0_,
   actiondat0_.ACTIONHISTORYID  as ACTIONHI4_9_0_
FROM   ACTIONDATA actiondat0_
WHERE  actiondat0_.CODE = 18 /* @p0 */

Последняя строка должна быть:

WHERE  actiondat0_.ACTIONHISTORYID = 18 /* @p0 */

Но я просто не понимаю, почему отображение не генерирует правильный запрос.

1 Ответ

0 голосов
/ 10 сентября 2011

Я знаю, что это было что-то ослепительно очевидное, и после нескольких часов бездействия оно, конечно, бросается на меня.

Карта классов ActionHistory, конечно, должна быть:

public class ActionHistoryClassMap : ClassMap<ActionHistory>
{
    public ActionHistoryClassMap ()
    {
        Table("ACTIONHISTORY");
        Id(x => x.Code, "CODE").GeneratedBy.Assigned();
        Map(x => x.Doneby, "DONEBY");
        HasMany(x => x._Actiondata).KeyColumn("ACTIONHISTORYID")
            .AsBag().Cascade.All();
    }
}

Разница в том, что метод KeyColumn теперь является ACTIONHISTORYID, а не CODE. Я не понял, что KeyColumn должен ссылаться на ключевой столбец ActionHistory. Сейчас это кажется очевидным, и не помогло то, что все остальные разы, когда я реализовывал это в этом проекте, столбцы с отношениями всегда имели одно и то же имя.

...