Я пытаюсь обернуть NHibernate вокруг устаревшей базы данных (не созданной мной). Он имеет то, что я могу лучше всего описать как «таблица таблиц», называемая TABLE_DETAIL. Это выглядит примерно так:
COLUMN_NAME | TABLE_VALUE | TABLE_DESC
-------------+-----------------+---------------------------------
state | CA | California
state | NY | New York
...
country | US | United States
country | CA | Canada
Я пытаюсь отобразить это с помощью Fluent NHibernate со стратегией таблицы на класс иерархии. Другими словами, у меня есть класс TableDetail и подклассы State и Country. Я использую COLUMN_NAME в качестве дискриминатора.
TableDetailMap.cs:
public class TableDetailMap : ClassMap<TableDetail>
{
public TableDetailMap()
{
Table("TABLE_DETAIL");
CompositeId()
.KeyProperty(x => x.TableValue, "TABLE_VALUE")
.KeyProperty(x => x.ColumnName, "COLUMN_NAME");
Map(x => x.ColumnName).Column("COLUMN_NAME");
Map(x => x.TableDesc).Column("TABLE_DESC");
DiscriminateSubClassesOnColumn("COLUMN_NAME");
}
}
StateMap.cs:
public class StateMap : SubclassMap<State>
{
public StateMap()
{
DiscriminatorValue("state");
}
}
TABLE_DETAIL, таким образом, имеет составной ключ (составленный из COLUMN_NAME / TABLE_VALUE), и дискриминатор является одним из этих полей. Моя проблема заключается в том, что NHibernate ожидает, что оба компонента составного ключа будут указаны в другой таблице, но это не обязательно, поскольку один из них определяется дискриминатором.
Например, у меня есть таблица ADDRESS_RECORD:
LINE_1 | CITY | STATE | ZIP
-----------------+-----------------+-----------+----------------
123 Any Street | Anytown | CA | 12345
Проблема возникает, когда я пытаюсь сопоставить свое поле "State" с моим классом State. Столбец STATE в ADDRESS_RECORD ссылается на половину первичного ключа TABLE_DETAIL - часть TABLE_VALUE. Часть COLUMN_NAME является «состоянием» - поскольку это дискриминатор, я ожидаю, что она должна быть предоставлена. Но NHibernate так не считает, и выдает это исключение:
Foreign key (FK3D33E87CA66E339C:ADDRESS_RECORD [STATE])) must have same number of columns as the referenced primary key (TABLE_DETAIL [TABLE_VALUE, COLUMN_NAME])
Как я могу отобразить это так, чтобы NHibernate знал, чтобы автоматически предоставлять "состояние" как значение для второй половины составного ключа?
Если я могу предоставить больше информации, пожалуйста, дайте мне знать.