2009-06-21 18 views
1

Ich habe verschiedene Ansätze zum Mapping der folgenden Struktur ausprobiert, aber ich gebe schließlich zu, dass ich nach einem Tag, an dem ich nicht sehr weit komme, Hilfe brauche.NHibernate Mapping Frage

Die Frage ist also, wie würdest du so etwas mappen? Das Schema ist zu diesem Zeitpunkt nicht festgelegt.

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

Ihre Eingabe wird sehr geschätzt.

Antwort

0

Ich hätte wahrscheinlich eine Tabelle für jede Klasse - Room, Item, Potion und dann ziemlich Standard-Mappings für jeden.

Ich mag, dass in meinen eigenen Erfahrungen beachten, es ist eine schlechte Idee, Ihr ID-Feld in Ihrem Unternehmen zu nennen Objekte „Id“

Hier ist ein Beispiel mit Item, einige Daten-Namen für Ihre Tabelle 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(); 
     } 
    } 

Dies ist mehr als wahrscheinlich nicht perfekt sein - wie ich bin nicht sicher, wie die Abbildung mit den abstrakt Eltern arbeitet.

0

Dies ermöglicht es Ihnen, alles in einer Tabelle zu haben ... dies aus dem Speicher tun, so Syntax möglicherweise nicht genau sein.

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