Редактировать
У меня есть ответ, и я опубликую его завтра.
У меня есть класс, который использует родительский столбец первичного ключа вместо своего собственного столбца первичного ключа.
Здесь задействованы два класса 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 */
Но я просто не понимаю, почему отображение не генерирует правильный запрос.