Я пытаюсь сопоставить устаревшую базу данных. Мне нужно реализовать то, что, по моему мнению, должно быть дискриминатором. Моя проблема заключается в том, что дискриминаторы работают только тогда, когда есть столбец для дифференциации или формула в текущей строке. Для моего случая нет фактического дифференциатора, данные либо соединяются с одной таблицей, если она существует, а если нет, то другая таблица. Чтобы сделать вещи еще более сложными, таблица использует составной ключ. Вот пример (это может быть упрощена, как я выдумываю):Сопоставление устаревшей базы данных с возможно дискриминатором
Учитывая мой код
public class SomeTable {
public virtual int DataID { get; set; }
public virtual int EmployeeOrCustomer { get; set; }
public virtual Person Person { get; set; }
public virtual int SomeValue { get; set; }
}
public abstract class Person {
public virtual int ID { get; set; }
public virtual string Name { get; set; }
}
public class Employee : Person {
public virtual int EmployeeNumber { get; set; }
}
public class Customer : Person {
public virtual int CustomerNumber { get; set; }
}
И мои данные
-SomeTable-
DataID(K) EmployeeOrCustomer(K) SomeValue
1 1 100
1 22 222
-Employee-
ID Name EmployeNumber
1 Joe Blow 12345
-Customer-
ID Name CustomerNumber
22 ACME Inc. 4242
Мои Отображения:
<class name="SomeTable" abstract="true">
<composite-id>
<key-property name="DataID" />
<key-property name="EmployeeOrCustomer" />
</composite-id>
<property name="SomeValue" />
<!-- ?????? -->
</class>
<class name="Employee">
<id name="ID" />
<Property name="EmployeeNumber">
</Class>
<class name="Customer">
<id name="ID" />
<Property name="CustomerNumber">
</Class>
Что я ожидаю
DataID: 1, SomeValue: 100 Person: { Employee: EmployeeNumber: 12345 }
DataID: 1, SomeValue: 222, Person: { Customer: CustomerNumber: 4242 }
Я думал о присоединении к 2 таблицам и использовании объединенных таблиц в качестве объединения, но 2 таблицы сильно различаются. Кроме того, я не могу изменить схему, поэтому добавление столбца дискриминатора не является вариантом.
Любые идеи?
Я не могу заставить этот сценарий работать. Не могли бы вы разместить код C#, который будет с ним идти? Я получаю либо неправильный SQL вообще, когда тип SomeTable.Person установлен в int. Когда я устанавливаю его в EmployeeOrcustomer как EmployeeOrcustomerType, я получаю ошибку «NHibernate.MappingException: Не удалось определить тип для ..». Я также рассматривал, как использовать union-subclass, и кажется, что это хорошо для случая, когда Employee или Customer всегда будут иметь одинаковые данные, связанные с ним (SomeData), но это не так. Я просто создал краткий пример, чтобы проиллюстрировать мою проблему. – sjeffrey
Похоже, у вас было это довольно близко. Я не заметил в отображении SomeTable. Похоже, это должно быть . Отмечено как правильный ответ. –
sjeffrey
ah thx, зафиксировали его – Firo