NHibernate加入了子类

时间:2009-04-29 15:02:23

标签: sql-server nhibernate inheritance nhibernate-mapping

我正在尝试用NHibernate和SQL服务器实现类继承hieararchy。我使用每个层次结构策略的表(在映射文件中有一个表和几个子类元素)可以正常工作。

然而,每个子类策略的表(一个映射文件中的N + 1个表和N个连接子类元素)在我的情况下更有意义,因为我想在子类表上放置一些约束。我正在努力解决我应该在masterclass表(Persons)和子类表(ContactPersons)上放置什么样的PK / FK关联。根据NHibernate文档,表之间应该存在主键关联。我试图将FK约束从子类PK放到主类PK但它仍然不起作用。我得到以下异常:

NHibernate.Exceptions.GenericADOException:无法插入:[Jobflow.Models.Entities.ContactPerson] [SQL:INSERT INTO ContactPersons(Email,Company,PersonID)VALUES(?,?,?)] ---> System.Data.SqlClient.SqlException:当IDENTITY_INSERT设置为OFF时,无法在表'ContactPersons'中为identity列插入显式值。

我确实尝试将IDENTITY_INSERT设置为ON,但这似乎没有帮助......

2 个答案:

答案 0 :(得分:4)

您需要将Persons中的列声明为int identity,但在ContactPersons中将其声明为int - 只需要一个表跟踪标识值。您的外键/主键很好,这是您需要解决的唯一问题。

NHibernate将插入到Persons中,使用SCOPE_IDENTITY()获取新的标识值,然后显式使用该值插入ContactPersons。

答案 1 :(得分:0)

我正在使用NH的SchemaExport创建架构。它在子类主键上创建一个外键:

alter table ContactPersons 
add constraint FK81E543E94B3FF9C3 
foreign key (Persons_FK) 
references Persons

Persons_FK在映射文件中声明

<joined-subclass name="ContactPersons">
  <key column="Persons_FK"/>
  ...