Pracuję ze starszą bazą danych, która używa kluczy złożonych. Próbuję użyć NHibernate do wstawienia nowego rekordu do bazy danych. NHibernate określa, że muszę ręcznie utworzyć identyfikator, ale gdy próbuję wstawić z tym ID otrzymuję komunikat:Wstawianie rekordu za pomocą klucza złożonego przy użyciu NHibernate
System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'tablename' when IDENTITY_INSERT is set to OFF.
nie mogę dotykać ustawieniami db jak są one podawane przez siedzibą w USA.
odkryłem, że mogę zrobić wkładkę db poprzez:
insert into tablename (tablename_country_id, /*extra fields here*/) values (16, /*extra values here*/)
a kolumna jest automatycznie zwiększany tablename_id
.
Czy jest możliwe napisanie jakiegoś programu obsługi, który pozwala mi utworzyć obiekt ID
za pomocą zestawu CountryId
i automatycznie zwiększyć jego właściwość Id
.
Pozdrawiam.
Przykład Kod:
Tabela Definicja:
CREATE TABLE [dbo].[tablename](
[tablename_country_id] [int] NOT NULL,
[tablename_id] [int] IDENTITY(1,1) NOT NULL,
-- more fields here
CONSTRAINT [pk_tablename] PRIMARY KEY
(
[tablename_country_id] ASC,
[tablename_id] ASC
)
)
klasy plików:
public class ModelObject
{
public ID { get; set; }
// more properties here
}
public class ID : INHibernateProxy
{
public int Id { get; set; }
public int CountryId { get; set; }
public ILazyInitializer HibernateLazyInitializer { get { throw new ApplicationException(); } }
}
Mapowanie plików
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model" assembly="API">
<class name="ModelObject" table="dbname.dbo.tablename" lazy="false">
<composite-id name="Id" class="ID">
<key-property name="Id" column="tablename_id" type="int" />
<key-property name="CountryId" column="tablename_country_id" type="int" />
</composite-id>
<!-- more properties here -->
</class>
</hibernate-mapping>
Jak to wpłynie na buforowanie obiektów? W szczególności 'session.Get (id);' z możliwością duplikacji w kolumnie 'tablename_id'. –
zonkflut
ta opcja powoduje, że wyjątek FKUnmatchingColumnsException "musi mieć taką samą liczbę kolumn, jak odwoływany klucz podstawowy" – zonkflut