我正在尝试用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,但这似乎没有帮助......
答案 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"/>
...