我是NHibernate的新手,并且我正在尝试使用Fluent的AutoMapping功能,因此我不需要手动维护单独的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创建外键约束的正确方法是什么?
答案 0 :(得分:1)
如果您想通过ID引用该名称,那么您应该这样做。 NHibernate足够聪明,可以弄清楚Person上的实际FK字段应该是什么以及应该指向的位置;毕竟,ORM旨在执行的工作。
尝试此映射:
public PersonMap()
{
Table("`Person`");
Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
References(x => x.Name, "`NameId`").Not.Nullable();
Map(x => x.Age).Column("`Age`").Nullable();
}
你已经映射了这个人和名字;因此,NHibernate知道哪个属性是Name的ID属性,并且可以在Person上创建和遍历外键。