NHibernate: вставка дополнительного вычисляемого столбца - PullRequest
1 голос
/ 12 мая 2010

Каков ваш подход с NHibernate, чтобы сделать следующее:
Когда Comment вставляется в БД, а его свойство Text вставляется в столбец Text (из-за сопоставления), вставьте в столбец TextHash хэш этого значения свойства.

Кажется тривиальным, если я сопоставляю TextHash, но как мне сделать это без сопоставления?
Мне это не нужно в доменной модели, это оптимизация на уровне БД (я бы использовал вычисленные HashBytes, если бы не ограничение длины).

Ответы [ 3 ]

1 голос
/ 15 мая 2010

Есть несколько похожих вопросов, таких как этот:
Несопоставленные столбцы в NHibernate?

Однако IInterceptor кажется излишним для изменения в одной вставке сущности. И EventListeners не совсем хорошо документированы, а также слишком сложны для одного столбца.

Итак, я выбрал решение, которое я считаю как наиболее многоразовым, так и наиболее локальным:

  <property name="Text" type="StringWithMD5HashUserType">
    <column name="Text" length="20000" not-null="true" />
    <column name="TextHash" length="32" not-null="true" />
  </property>

Где StringWithMD5HashUserType - это ICompositeUserType, который читает Text из первого столбца, но записывает как Text, так и Hash (я не добавляю код StringWithMD5HashUserType, потому что он слишком длинный, но по сути очень просто).

0 голосов
/ 12 мая 2010

Вот предложение: Насколько я знаю, вы не можете получить доступ к столбцу в вашей БД, используя NHibernate, если для него не определено отображение. Чтобы другие части вашего приложения не могли видеть это поле вашего класса, вы можете определить его доступ как поле в вашем отображении, чтобы оно могло быть частным, и никто не знает, что оно существует, кроме NHibernate: В вашем классе:

private string _textHash

В вашем отображении:

<property name='_textHash' column='TextHash' access='field' />
0 голосов
/ 12 мая 2010

Ну, если вы не хотите использовать это свойство, объявите его частным и вычислите его при установке свойства text. Это не совсем «без сопоставления», но вы не увидите его при использовании класса (заявление об отказе: совет, основанный на Hibernate, в отличие от NHibernate).

Кроме этого, вы всегда можете написать триггер, хотя лично я бы предпочел добавить личное поле и покончить с этим.

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