Таблица отображения таблиц NHibernate - PullRequest
0 голосов
/ 25 января 2011

Я пытаюсь обернуть 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 знал, чтобы автоматически предоставлять "состояние" как значение для второй половины составного ключа?

Если я могу предоставить больше информации, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 28 января 2011

Я придумал так себе исправить. В карте базового класса ( TableDetailMap.cs ), где я указал дискриминатор, я указал «всегда выбирать со значением», например:

public class TableDetailMap : ClassMap<TableDetail>
{
  public TableDetailMap()
  {
    ...snip...

    DiscriminateSubClassesOnColumn("COLUMN_NAME").AlwaysSelectWithValue();
  }
}

Затем во всех классах отображения, использующих объект TableDetail , мне пришлось указать, что при выборке нужно использовать «select», например:

public class AddressRecordMap : ClassMap<AddressRecord>
{
  public AddressRecordMap()
  {
    ...snip...

    References(x => x.State)
      .Column("STATE")
      .Fetch.Select();

    ...snip...
  }
}

Это все еще не работало в случае, когда один из этих объектов использовался как часть составного идентификатора. Я не уверен, как это исправить, но сейчас я смог обойти это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...