NHibernate映射问题

时间:2009-06-21 15:27:50

标签: nhibernate fluent-nhibernate nhibernate-mapping

我已经尝试了各种方法来映射以下结构,但我终于承认,经过一天没有走得太远,我需要一些帮助。

所以问题是,你们将如何映射这样的东西。此时架构尚未修复。

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

非常感谢您的意见。

2 个答案:

答案 0 :(得分:0)

我可能每个班级都有一张桌子 - Room,Item,Potion,然后为每个班级做相当标准的映射。

我想请注意,根据我自己的经验,在您的业务对象“Id”中命名您的Id字段是个坏主意

这是一个带有Item的示例,为您的表格提供一些数据名称。

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

这很可能并不完美 - 因为我不确定映射如何与抽象父级一起使用。

答案 1 :(得分: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);
                    })