#c# #nhibernate #inheritance #nhibernate-mapping
#c# #nhibernate #наследование #nhibernate-сопоставление
Вопрос:
У меня есть следующие сопоставленные классы:
<class name="Company" table="Company">
<id name="ID" column="CompanyID">
<generator class="native"/>
</id>
<joined-subclass name="CompanyAccounting" table="company_accounting" lazy="true">
<key column="CompanyID"/>
</joined-subclass>
<joined-subclass name="CompanyCarbon" table="company_carbon" lazy="true">
<key column="CompanyID" />
</joined-subclass>
</class>
Теперь следующий тест завершается с ошибкой:
var company = CompanyAdapter.Get<Company>(_session, 32);
Assert.IsNotNull(company);
var client = CompanyAdapter.Get<CompanyClient>(_session, 32);
Assert.IsNotNull(client);
Но следующее выполняется успешно:
var client = CompanyAdapter.Get<CompanyClient>(_session, 32);
Assert.IsNotNull(client);
var company = CompanyAdapter.Get<Company>(_session, 32);
Assert.IsNotNull(company);
Причина, по которой первый тест не выполняется, заключается в том, что NHibernate извлекает компанию как CompanyAccounting, поскольку Company (32) является одновременно бухгалтерской компанией и клиентом, и когда я вызываю Session.Get после того, как он извлек company как CompanyAccounting, он не возвращается в базу данных и не проверяет, есть ли запись для CompanyClient, предполагается, что Company может быть только в подклассе, есть ли способ указать, что она может наследовать от всех подклассов?
Ответ №1:
В итоге я провел рефакторинг своих классов, и вместо того, чтобы иметь
класс Company, класс CompanyClient: Компания, класс CompanyAccounting: Компания
Я сделал CompanyClient и CompanyAccounting не наследуемыми от Company и добавил Company в качестве <one-to-one>
отношения, которое является первичным ключом для этих классов.