Резюме: Родительский и Детский класс. Отношения один к одному между Родителем и Ребенком. Родитель имеет свойство FK, которое ссылается на первичный ключ дочернего элемента. Код следующий:
public class NHTestParent
{
public virtual Guid NHTestParentId { get; set; }
public virtual Guid ChildId
{
get
{
return ChildRef.NHTestChildId;
}
set { }
}
public virtual string ParentName { get; set; }
protected NHTestChild _childRef;
public virtual NHTestChild ChildRef
{
get
{
if (_childRef == null)
_childRef = new NHTestChild();
return _childRef;
}
set
{
_childRef = value;
}
}
}
public class NHTestChild
{
public virtual Guid NHTestChildId { get; set; }
public virtual string ChildName { get; set; }
}
Со следующими отображениями Fluent:
Родительское сопоставление
Id(x => x.NHTestParentId);
Map(x => x.ParentName);
Map(x => x.ChildId);
References(x => x.ChildRef, "ChildId").Cascade.All();
Детское картирование:
Id(x => x.NHTestChildId);
Map(x => x.ChildName);
Если я сделаю что-то вроде (псевдокод) ...
HTestParent parent = new NHTestParent();
parent.ParentName = "Parent 1";
parent.ChildRef.ChildName = "Child 1";
nhibernateSession.SaveOrUpdate(aParent);
Commit;
... Я получаю сообщение об ошибке: «Недопустимый индекс 3 для этой SqlParameterCollection с Count = 3»
Если я изменю родительскую строку «Ссылки» следующим образом (т.е. укажите имя дочернего свойства, на которое я указываю):
References(x => x.ChildRef, "ChildId").PropertyRef("NHTestChildId").Cascade.All();
Я получаю сообщение об ошибке: «Не удается разрешить свойство: NHTestChildId»
Итак, я попробовал настройку ссылки HasOne () следующим образом:
HasOne<NHTestChild>(x => x.ChildRef).ForeignKey("ChildId").Cascade.All().Fetch.Join();
В этом случае сохранение работает (и данные в БД соответствуют желаемым), но загрузка не может найти дочернюю сущность. Изучение SQL, создаваемого Nhibernate, показывает, что NHibernate предполагает, что первичным ключом родителя является ссылка на дочерний элемент (т. Е. Условием загрузки соединения является «parent.NHTestParentId = child.NHTestChildId). Указанный мной« ForeignKey », по-видимому, игнорируется - если факт, что я могу установить любое значение (даже поле несуществования), и никакой ошибки не происходит - соединение всегда терпит неудачу, и никакой дочерний элемент не возвращается.
Я пробовал несколько небольших вариаций на вышеуказанном. Кажется, что это должно быть простой вещью для достижения. Есть идеи?