Я новичок в NHibernate и пытаюсь использовать возможность AutoMapping Fluent, чтобы мне не нужно было поддерживать отдельные XML-файлы вручную. К сожалению, я сталкиваюсь с проблемой со ссылками на сущности, в частности, ' Исключение произошло, метод получения Fluent_NHibernate_Demo.Domain.Name.Id ' - System.Reflection.TargetException: объект не соответствует типу цели .
Кажется, у меня есть ошибка по крайней мере в одном из моих классов сопоставления, хотя они генерируют правильный SQL (т. Е. Созданные таблицы имеют правильные индексы).
Реализации для моделей и отображений моего домена:
Name.cs
public class Name
{
public virtual int Id { get; protected set; }
public virtual string First { get; set; }
public virtual string Middle { get; set; }
public virtual string Last { get; set; }
}
Person.cs
public class Person
{
public virtual int Id { get; protected set; }
public virtual Name Name { get; set; }
public virtual short Age { get; set; }
}
NameMap.cs
public NameMap()
{
Table("`Name`");
Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
Map(x => x.First).Column("`First`").Not.Nullable().Length(20);
Map(x => x.Middle).Column("`Middle`").Nullable().Length(20);
Map(x => x.Last).Column("`Last`").Not.Nullable().Length(20);
}
PersonMap.cs
public PersonMap()
{
Table("`Person`");
Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
References<Name>(x => x.Name.Id, "`NameId`").Not.Nullable();
// There's no exception if the following line is used instead of References
// although no constraint is created
// Map(x => x.Name.Id).Column("`NameId`").Not.Nullable();
Map(x => x.Age).Column("`Age`").Nullable();
}
Наконец, следующий код выдаст исключение:
Name name = new Name { First = "John", Last = "Doe" };
session.Save(name);
Person person = new Person { Name = name, Age = 22 };
session.Save(person); // this line throws the exception
Как уже упоминалось, созданная схема верна, но я не могу сохранить, используя приведенный выше код. Как правильно создать ограничение внешнего ключа с помощью Fluent NHibernate?