Domanda

Sto provando a implementare l'hereararchy di ereditarietà delle classi con NHibernate e SQL server. L'ho fatto funzionare bene con la strategia della tabella per gerarchia (una tabella e diversi elementi della sottoclasse nel file di mapping).

Tuttavia la strategia della tabella per sottoclasse (N + 1 tabelle e N elementi della sottoclasse unita in un file di mappatura) ha più senso nel mio caso perché voglio mettere alcuni vincoli sulle tabelle delle sottoclassi. Sto lottando con quale tipo di associazione PK / FK dovrei mettere nella tabella della masterclass (Persone) e nella tabella della sottoclasse (ContactPersons). Secondo la documentazione di NHibernate, dovrebbe esserci un'associazione chiave primaria tra le tabelle. Ho provato a mettere il vincolo FK dalla sottoclasse PK alla classe master PK ma non funziona ancora. Ottengo la seguente eccezione:

NHibernate.Exceptions.GenericADOException: impossibile inserire: [Jobflow.Models.Entities.ContactPerson] [SQL: INSERT INTO ContactPersons (Email, Company, PersonID) VALUES (?,?,?)] --- > System.Data.SqlClient.SqlException: impossibile inserire il valore esplicito per la colonna identità nella tabella "ContactPersons" quando IDENTITY_INSERT è impostato su OFF.

Ho provato a impostare IDENTITY_INSERT su ON ma questo non sembra aiutare ...

È stato utile?

Soluzione

Devi dichiarare la colonna in Persone come identità int, ma in ContactPersons solo come int - solo una tabella deve tenere traccia del valore dell'identità. Le tue chiavi esterne / chiavi primarie vanno bene, questo è l'unico problema che devi affrontare.

NHibernate inserirà in Persone, otterrà il nuovo valore di identità utilizzando SCOPE_IDENTITY (), quindi utilizzerà tale valore esplicitamente per l'inserimento in ContactPersons.

Altri suggerimenti

Sto creando lo schema con SchemaExport di NH. Crea una chiave esterna sulla chiave primaria delle sottoclassi:

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

Persons_FK è dichiarato nel file di mappatura

<joined-subclass name="ContactPersons">
  <key column="Persons_FK"/>
  ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top