NHibernate中列和表的复杂映射

时间:2011-01-12 11:57:12

标签: c# nhibernate fluent-nhibernate nhibernate-mapping

我有一个相当简单的数据库:

表NamedItem
列:
Id(PK)
国家(字符串)
类别(字符串)
MainName(字符串)

表AlternateNames
列:
NamedItemId(FK to NamedItem.Id)
AlternateName(字符串)

我希望将以下类和枚举映射到这两个表:

enum国家{德国,英格兰,西班牙} // DB中的枚举值和国家/地区字符串的名称必须相同
枚举类别{A,B,C} // DB中枚举值和类别字符串的名称必须相同 class Item {Guid ID {get; set;} ItemNames Names {get; set;}}
class ItemNames {string MainName {get; set;} IList < string > AlternateNames {get;设置;}}

更新
重要的不是枚举,而是包含来自两个不同表的部分的类ItemNames,它们位于其中一个表的实体中。

这可能与NHibernate一起使用,最好是使用Fluent NHibernate吗? 如果是这样,请给我一个快速启动。我无法弄明白,怎么做。

亲切的问候,

丹尼尔

P.S。我在Microsoft实体框架论坛中发布了相同的问题,询问是否可以使用EF4。根据答案,我将选择我将使用的框架。万一有人想知道......

1 个答案:

答案 0 :(得分:1)

只需将类映射为正常的字符串数据类型。 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;}
    ...
}

我将集合设置为集合,因为它会阻止集合中的重复项,这有时会导致问题。