Как можно сопоставить строки из трех таблиц в одну сущность с помощью NHibernate / FluentNHibernate? - PullRequest
1 голос
/ 04 февраля 2011

Я справился с этой конкретной проблемой, так как я еще новичок в NHibernate / FluentNHibernate.Я опишу проблему подробно, но прежде чем я это сделаю, я хотел бы отметить, что я могу изменить как модель домена , так и базовую базу данных, как я считаю нужным.Однако у меня есть конкретные причины для моего текущего дизайна, и я хотел бы придерживаться его, если смогу.

У меня есть объект User.У пользователя есть некоторые предпочтения, такие как выбранная им культура («en-US» / «fr-CA» и т. Д.) И предпочитаемая им система конвертации (Metric / British Imperial и т. Д.).Есть и другие предпочтения, и дальнейшие предпочтения могут (и будут) добавляться со временем.Поэтому я не хочу представлять предпочтения в виде столбцов в основной пользовательской таблице.Скорее, я хочу, чтобы структура таблицы выглядела так (псевдо-SQL):

Table Preference (int Id, nvarchar(50) Description)
Table PreferenceOption (bigint Id, int PreferenceId, nvarchar(50) Value)
Table UserPreferences (int Id, uniqueidentifier UserId, bigint PreferenceOptionId)

Один параметр (т. Е. «Культура») может иметь несколько параметров (например, «en-GB», «fr-CA»).).Предпочтения пользователя хранятся в таблице UserPreferences, которая имеет внешний ключ к таблице PreferenceOption.

Я бы хотел, чтобы модель моего домена выглядела следующим образом:

public class User
{
  public virtual Guid {get;set;}
  public virtual Preferences {get;set;}
}

public class Preferences
{
  public virtual CultureInfo Culture{get;}
  public virtual ConversionType ConversionType {get;}
}

Я представлял, что я 'попробуйте загрузить все настройки, принадлежащие пользователю, в коллекцию (в классе Preferences) и позволить свойствам выполнить соответствующее преобразование в CultureInfo и ConverstionType (пользовательское перечисление) соответственно.

Я был бы очень признателендля любых указателей на это.

1 Ответ

1 голос
/ 04 февраля 2011

Я не думаю, что NHibernate сможет справиться со всеми угловыми случаями в этой ситуации.Что произойдет, если у вас нет предпочтения с Id для CultureInfo в таблице PreferenceOption?Что если Preference вообще не существует?Откуда он знает, чтобы сопоставить CultureInfo с определенной строкой в ​​таблице PreferenceOption?(Действительно ли Description является константой, которая описывает, какое свойство нужно заполнить?)

Я думаю, что вы напрашиваетесь на неприятности.Если вы хотите использовать такую ​​схему, думаю, вам повезет с более прямым отображением вашей схемы в ваших POCO NHibernate.Вы можете написать некоторый код, чтобы достаточно легко заполнить ваш объект Preferences из строк таблицы PreferenceOption, связанных с вашим пользователем.

Откровенно говоря, если вы уже знаете, что будут какие-то пользовательские настройки, добавьте ихк вашей схеме.Гораздо проще иметь дело со многими ситуациями (например, с отчетностью и т. Д. - по крайней мере, с одним меньшим числом соединений и большим детерминизмом), чем с таблицей «дампинга» для практически нетипизированных, динамических данных.

Если вы думаете, что 'Мне понадобится, я бы оставил свалку на всякий случай.Но если у вас есть возможность включить данные, которые вы знаете , вам нужны в вашей схеме на этом этапе разработки, сделайте это вместо этого.

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