2009-06-21 155 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); 
        })