Сложное отображение столбцов и таблиц в NHibernate - PullRequest
1 голос
/ 12 января 2011

У меня довольно простая база данных:

таблица NamedItem
Колонки:
Идентификатор (ПК)
Страна (строка)
Категория (строка)
MainName (строка)

таблица AlternateNames
Колонки:
NamedItemId (от FK до NamedItem.Id)
AlternateName (строка)

Я хочу иметь следующие классы и перечисления для сопоставления с этими двумя таблицами:

enum Страна {Германия, Англия, Испания} // Имя значения перечисления и строка страны в БД должны совпадать
enum Category {A, B, C} // Имя значения перечисления и строка категории в БД должны совпадать
Класс Item {Guid ID {get; set;} ItemNames Имена {get; set;}}
class ItemNames {string MainName {get; set;} IList < string > AlternateNames {get; set;}}

UPDATE
Важно не перечисления, а тот класс ItemNames, который содержит части из двух разных таблиц и находится в сущности одной из этих таблиц.

Возможно ли это с NHibernate, предпочтительно с Fluent NHibernate?
Если так, пожалуйста, дайте мне старт. Я не мог понять, как это сделать.

С уважением,

Daniel

P.S. Я написал тот же вопрос на форуме Microsoft Entity Framework, спрашивая, возможно ли это с EF4. В зависимости от ответов я выберу рамки, которые буду использовать. На всякий случай, если кому-то интересно ...

1 Ответ

1 голос
/ 13 января 2011

Просто отобразите класс так, как если бы он был обычным типом данных строки.NH вызовет метод ToString для действующего значения, сохраняя текстовое значение перечисления в базе данных.

, поэтому сопоставление может выглядеть примерно так:

public partial class ItemMap : ClassMap< Item >
{
    Table( "NamedItem" ) ;
    Id(x => x.Id, "Id" )
        .Not.Nullable()
        .GeneratedBy.Guid();

    Map( x => x.Country )
        .Column( "Country" )
        .Not.Nullable( )
        .Length( 255 ) ;

    Map( x => x.Category )
        .Column( "Category" )
        .Not.Nullable( )
        .Length( 255 ) ;
    ...

    HasMany< ItemName >( x => x.ItemNames )
        .KeyColumns.Add( "NamedItemId" )
        .Table( "AlternateNames" )
        .LazyLoad( )
        .Cascade.None( )
        .AsSet() ;
    ...
}

и класс похож на

public class Item
{
    public virtual Guid Id { get; set; }
    public virtual CountryType Country { get; set; }
    public virtual CategoryType Category { get; set; }
    ...
    public virtual ISet< ItemNames > AlternateNames {get; set;}
    ...
}

У меня есть набор для набора, так как в нем останутся дубликаты, которые иногда могут вызвать проблемы.

...