Свободно соединенные таблицы NHibernate один на один - PullRequest
0 голосов
/ 08 апреля 2010

Я думаю, что это вопрос неофита умеренно. Я использую NHibernate / FluentNHibernate около 6 месяцев или около того, и я думаю, что я достаточно хорошо понимаю основы. Теперь я немного подталкиваю. Я уверен, что это задокументировано, но я провел несколько часов в Google и не совсем понял.

У меня есть простой класс, назовите его Simple:

public class Simple
{ public string Name { get; set;}
  public string Desc { get; set; }
  public string Status { get; set;}
}

Состояние фактически ограничено одним из небольшого набора значений: «ACTIVE», «ON-HOLD» и «CLOSED». В схеме БД у меня есть простая таблица только для чтения с именем RetrofitStatus:

CREATE TABLE [dbo].[RetrofitStatus](
[Status] [nvarchar](10) NOT NULL,
[SortOrder] [smallint] NOT NULL,
CONSTRAINT [PK_RetrofitStatus] PRIMARY KEY CLUSTERED 
(
    [Status] ASC
)

И есть ограничение внешнего ключа для таблицы Simple, чтобы убедиться, что Status находится в RetrofitStatus.

Цель таблицы RetrofitStatus - включить столбец SortOrder, чтобы я мог (в SQL)

SELECT * from Simple s join RetrofitStatus r on r.Status=s.Status ORDER BY r.SortOrder

и сортируйте мои результаты в порядке отображения (например, сначала все записи ACTIVE, затем записи ON-HOLD, затем записи CLOSED, поскольку я сортирую по логическому порядку, а не по алфавиту или что-либо еще, что легко распознается).

Мой вопрос: как мне моделировать этот объект и отношения в FNH? Я могу добавить свойство SortOrder к своему простому определению и создать представление, которое представляет это, но что произойдет, когда я попытаюсь вставить новые простые объекты в таблицу? Очевидно, я не хочу пытаться вставить свойство SortOrder. Я думаю, что мне нужно каким-то образом использовать элемент NHib, но, опять же, я не понимаю, куда это должно идти, что происходит при вставке и как это сделать в Fluent?

Я собираюсь попробовать поэкспериментировать с методом проб и ошибок, но я подумал, что, возможно, кто-то, кто знает, что они делают (а я нет), может указать мне верное направление и сэкономить мне время. Спасибо за вашу помощь.

1 Ответ

1 голос
/ 10 апреля 2010

Предполагается, что класс Simple был изменен следующим образом (я не был уверен, что вы делаете с ключом):

public class Simple
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Desc { get; set; }
    public string Status { get; set; 
    public int SortOrder { get; set; }
}

Вы можете отобразить карту так:

public SimpleMap : ClassMap<Simple>
{
    Id(x => x.Id).Unique().GeneratedBy.Native();
    Map(x => x.Name);
    Map(x => x.Desc);
    Join("RetrofitStatus", join =>
    {
        join.KeyColumn("Status") 
            .Map(x => x.Status);
        join.Map(x => x.SortOrder).Not.Insert();
    });
}

Я не проверял это, но это суть.

Вы можете указать, что свойство не может быть вставлено или обновлено с помощью Not.Insert() или Not.Update(), соответственно, в вашем отображении, или его нельзя ни вставить, ни обновить с помощью ReadOnly().

...