2013-02-10 4 views
0

Я пытаюсь сопоставить устаревшую базу данных. Мне нужно реализовать то, что, по моему мнению, должно быть дискриминатором. Моя проблема заключается в том, что дискриминаторы работают только тогда, когда есть столбец для дифференциации или формула в текущей строке. Для моего случая нет фактического дифференциатора, данные либо соединяются с одной таблицей, если она существует, а если нет, то другая таблица. Чтобы сделать вещи еще более сложными, таблица использует составной ключ. Вот пример (это может быть упрощена, как я выдумываю):Сопоставление устаревшей базы данных с возможно дискриминатором

Учитывая мой код

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 таблицы сильно различаются. Кроме того, я не могу изменить схему, поэтому добавление столбца дискриминатора не является вариантом.

Любые идеи?

ответ

1

я думаю, что вы ищете это единение выполните картирование подкласса Наследование

<class name="Person" abstract="true"> 
    <id name="Id"> 
    <generator class="assigned"/> 
    </id> 

    <union-subclass table="Employee" name="Employee"> 
    <property name="Name"/> 
    <property name="EmployeeNumber"/> 
    </union-subclass> 

    <union-subclass table="Customer" name="Customer"> 
    <property name="Name"/> 
    <property name="CustomerNumber"/> 
    </union-subclass> 
</class> 

<class name="SomeTable" abstract="true"> 
    <composite-id> 
    <key-property name="DataID" /> 
    <key-many-to-one name="Person" column="EmployeeOrCustomer" /> 
    </composite-id> 
    <property name="SomeValue" /> 
</class> 

Примечание дополнительное свойство EmployeeOrCustomer не требуется.

+0

Я не могу заставить этот сценарий работать. Не могли бы вы разместить код C#, который будет с ним идти? Я получаю либо неправильный SQL вообще, когда тип SomeTable.Person установлен в int. Когда я устанавливаю его в EmployeeOrcustomer как EmployeeOrcustomerType, я получаю ошибку «NHibernate.MappingException: Не удалось определить тип для ..». Я также рассматривал, как использовать union-subclass, и кажется, что это хорошо для случая, когда Employee или Customer всегда будут иметь одинаковые данные, связанные с ним (SomeData), но это не так. Я просто создал краткий пример, чтобы проиллюстрировать мою проблему. – sjeffrey

+0

Похоже, у вас было это довольно близко. Я не заметил в отображении SomeTable. Похоже, это должно быть . Отмечено как правильный ответ. – sjeffrey

+0

ah thx, зафиксировали его – Firo