質問

NHibernateとSQLサーバーでクラス継承階層を実装しようとしています。階層ごとの戦略のテーブル(マッピングファイル内の1つのテーブルといくつかのサブクラス要素)で問題なく動作するようにしました。

ただし、サブクラスごとの戦略(1つのマッピングファイル内のN + 1個のテーブルとN個の結合サブクラス要素)は、サブクラステーブルにいくつかの制約を設定するため、より意味があります。マスタークラステーブル(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列に明示的な値を挿入できません。

IDENTITY_INSERTをONに設定しようとしましたが、助けにはならないようです...

役に立ちましたか?

解決

Personsの列をint IDとして宣言する必要がありますが、ContactPersonsではintとして宣言します。ID値を追跡する必要があるテーブルは1つだけです。外部キー/主キーは問題ありません。これが取り組む必要がある唯一の問題です。

NHibernateはPersonsに挿入し、SCOPE_IDENTITY()を使用して新しいID値を取得し、ContactPersonsへの挿入にその値を明示的に使用します。

他のヒント

NHのSchemaExportでスキーマを作成しています。サブクラスの主キーに外部キーを作成します:

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

Persons_FKはマッピングファイルで宣言されています

<joined-subclass name="ContactPersons">
  <key column="Persons_FK"/>
  ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top