2009-04-29 15 views
3

NHibernateとSQLサーバーでクラス継承hieararchyを実装しようとしています。私はそれをテーブル階層戦略(1つのテーブルとマッピングファイルのいくつかのサブクラス要素)でうまく動作させるようにしました。NHibernate joined-subclass

サブクラステーブルにいくつかの制約を設定したいので、サブクラス戦略(N + 1テーブルと1つのマッピングファイル内のN joined-subclass要素)は私の場合より意味があります。私は、マスタークラステーブル(Persons)とサブクラステーブル(ContactPersons)にどのようなPK/FK関連付けをするべきかと苦労しています。 NHibernateのドキュメントによると、テーブル間には主キーの関連があるはずです。私はサブクラスPKからマスタークラスPKにFK制約を入れようとしましたが、それでも動作しません。

NHibernate.Exceptions.GenericADOException:[Jobflow.Models.Entities.ContactPerson] [SQL:INSERT INTO ContactPersons(Email、Company、PersonID)VALUES(?、?、?)を挿入できませんでした。 ] ---> System.Data.SqlClient.SqlException:IDENTITY_INSERTがOFFに設定されている場合、テーブル 'ContactPersons'のID列に明示的な値を挿入できません。

私はONにIDENTITY_INSERTを設定しようとしましたが、それは助けていないようでした...

答えて

4

あなたはint型のアイデンティティとして、人の列を宣言する必要がありますが、単にintとしてContactPersons中 - 一つだけのテーブルのニーズアイデンティティ値を追跡する。あなたの外部キー/プライマリキーは問題ありませんが、これはあなたが取り組む必要がある唯一の問題です。

NHibernateはPersonに挿入し、SCOPE_IDENTITY()を使用して新しいID値を取得し、その値をContactPersonに挿入するために明示的に使用します。

0

私はNHのSchemaExportでスキーマを作成しています。これは、サブクラスの主キーに対する外部キーを作成:Persons_FKは、マッピングファイルで宣言されている

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

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