2011-01-12 63 views
1

列和表的复杂的映射我有一个相当简单的数据库:NHibernate的

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

表AlternateNames
色谱柱:
NamedItemId(FK到NamedItem.Id)
AlternateName(串)

我想有以下类和枚举映射到这两个表:

枚举国家{德国,英国,西班牙} //在DB枚举值和国家字符串名称必须是相同的
枚举类别{A,B,C} //枚举值和在DB类别字串名称必须是相同的
类物品{GUID ID {得到;集;} itemNames中名称{ get; set;}}
class ItemNames {string MainName {get; set;} IList <字符串> AlternateNames {get;设置;}}

UPDATE
重要的事情是不是枚举,但包含来自两个不同的表部分,位于这些表之一的实体类itemNames的。

这可能与NHibernate,最好与流利的NHibernate?
如果是这样,请给我一个跳跃开始。我无法弄清楚,怎么做。

亲切的问候,

丹尼尔

附:我在Microsoft Entity Framework论坛发布了相同的问题,询问EF4是否可行。根据答案,我将选择我将使用的框架。以防万一有人想知道...

+0

它可以很容易地安静。我一直都这样做,因为MySql支持枚举数据类型。无论如何,我会在今天晚些时候为你发布一些流利的映射代码。 – cdmdotnet 2011-01-12 22:26:37

回答

1

只需将该类映射为正常字符串数据类型即可。 NH将调用该值的ToString方法,将enum的文本值保存到数据库中。

所以你映射可能看起来像:

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;} 
    ... 
} 

我有收集组一组为一类停止重复采集它可以在被有时造成问题。

+0

嗨cdmdotnet,谢谢你的回答!不幸的是,似乎我对我的问题还没有足够详细:问题不在于枚举,而在于类ItemNames。请注意,在我的Item类中没有备用名称列表,也没有主名称,但那些名称在该子类中。另外,AlteranateNames是一个字符串列表。没有任何“特殊”实体类型...我更新了我的问题。 – 2011-01-13 08:16:10