nhibernate: Как мне сопоставить компонент, который ссылается на сущность? - PullRequest
3 голосов
/ 08 апреля 2009

Мой БД выглядит примерно так:

MyEntity     State
-----        -----
id           id
street       name
stateId      ...
zip
status
...

Моя модель выглядит так:

class MyEntity
{
     int id { get; set; }
     Address location { get; set; }
     string status { get; set; }
     // ...
}

class Address
{
    string street { get; set; }
    string zip { get; set; }
    State state { get; set; }
    // ...
}

class State
{
    int id { get; set; }
    string name { get; set; }
    // ...
}

Мне немного неудобно, когда мой компонент адреса ссылается на сущность. Пахнет как бедная модель. Это? Если нет, то как бы я отобразил это (желательно с беглым nhibernate)?

1 Ответ

2 голосов
/ 08 апреля 2009

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

Что касается отображения, это довольно просто:

public class MyEntityMap : ClassMap<MyEntity>
{
    public MyEntityMap()
    {
        Id(x => x.id);
        Component<Address>(x => x.location, c =>
        {
            c.Map(x => x.street);
            c.Map(x => x.zip);
            c.References<State>(x => x.state);
        });
        Map(x => x.status);
    }
}

Иногда я добавляю статический класс для компонента, чтобы сделать ClassMap немного лучше:

public static class NameMap
{
    public static Action<ComponentPart<Name>> AsComponent(string prefix)
    {
        return c =>
        {
            c.Map(x => x.Title, ColumnName(prefix, "Title"));
            // and so on
        };
    }
}

В этом случае ColumnName - это простая функция, которая присоединяет префикс к имени столбца (что очень удобно в замечательных устаревших БД, в которых я могу играть).

Затем в ClassMap вы просто делаете:

Component<Name>(x => x.Name, c => NameMap.AsComponent("prefix"));
...