2009-06-21 249 views
1

我已经尝试过各种方法来映射下面的结构,但是我终于承认,在一天没有变得很远之后,我需要一些帮助。NHibernate映射问题

所以问题是,你们会如何去映射这样的东西。在这一点上架构不固定。

public abstract class BaseObject 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual string Prefix { get; set; } 
    public virtual string Suffix { get; set; } 
    public virtual BaseObject Parent { get; set; } 
} 

public class Room : BaseObject 
{ 
    public virtual int AreaId { get; set; } 

} 

public class Item : BaseObject 
{ 
    public virtual string Owner { get; set; } 
    public virtual IList<ItemAttribute> Attributes { get; set; } 
    public virtual int ItemTypeId { get; set; } 

} 

public class Potion : Item 
{ 
    public virtual int AmountLeft { get; set; } 
} 

您的意见非常赞赏。

回答

0

我可能会为每个班级提供一个表格 - 房间,项目,药水,然后为每个班级做相当标准的映射。

我想指出,在我自己的经验,这是一个坏主意来命名你的企业你的ID字段对象“ID”

下面是与项目的样本,assoming一些数据的名称为您的表。

public class ItemMap : ClassMap<Item> 
    { 
     public ItemMap() 
     { 
      WithTable("Items"); 

      Id(x => x.Id, "ItemId").GeneratedBy.Identity(); 

      Map(x => x.Name); 
      Map(x => x.Description); 
      Map(x => x.Prefix); 
      Map(x => x.Suffix); 
      Map(x => x.Owner); 
      Map(x => x.ItemTypeId); 

      References<Item>(x => x.Parent, "ParentItemId"); 

      HasManyToMany(x => x.Attributes) 
       .WithParentKeyColumn("ItemId") 
       .WithChildKeyColumn("AttributeId") 
       .WithTableName("ItemAttributes") 
       .LazyLoad(); 
     } 
    } 

这很可能不是完美的 - 因为我不确定映射如何与抽象父项一起工作。

0

这可以让你把它全部放在一张表中......从内存中做这件事,所以语法可能不准确。

public class ItemMap : ClassMap<BaseObject> 
{ 

... 

    WithTable("objects"); 
    Id(x => x.Id).GeneratedBy.Identity(); 
    Map(x => x.Name); 
    Map(x => x.Description); 

    ... 

    DiscriminateSubClassesOnColumn("Type") 

     .SubClass<Room>("Room", x => 
        { 
         x.Map(r => r.AreaId); 
        }) 

     .SubClass<Item>("Item", c => 
               { 
                i.Map(x => x.Owner); 
                i.References(x => x.Account).LazyLoad(); 
                HasManyToMany(x => x.Attributes) 
                 .WithParentKeyColumn("ItemId") 
                 .WithChildKeyColumn("AttributeId") 
                 .WithTableName("ItemAttributes") 
                 .LazyLoad();  
               }); 

    .SubClass<Potion>("Potion", x => 
        { 
         x.Map(p => p.AmountLeft); 
        })