2009-06-21 14 views
1

私は以下の構造をマッピングするさまざまな方法を試しましたが、最終的にはそれほど遠くになっていない一日の後に、私はいくつかの助けが必要です。NHibernate Mapping Question

質問がありますので、どうやってこのようなマッピングをしましょうか。スキーマはこの時点では固定されていません。

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

これにより、すべてを1つのテーブルにまとめることができます。これをメモリから実行すると、構文が正確ではない可能性があります。

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