NHibernate映射问题

NHibernate映射问题,nhibernate,fluent-nhibernate,nhibernate-mapping,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; } p

我尝试了各种方法来映射以下结构,但我最终承认,在一天没有走多远之后,我需要一些帮助

所以问题是,你们如何绘制这样的地图。架构在这一点上是不固定的

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; }
}
公共抽象类BaseObject
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟字符串描述{get;set;}
公共虚拟字符串前缀{get;set;}
公共虚拟字符串后缀{get;set;}
公共虚拟基对象父对象{get;set;}
}
公共教室:BaseObject
{
公共虚拟int区域ID{get;set;}
}
公共类项:BaseObject
{
公共虚拟字符串所有者{get;set;}
公共虚拟IList属性{get;set;}
公共虚拟int ItemTypeId{get;set;}
}
公共类药剂:物品
{
公共虚拟int AmountLeft{get;set;}
}

非常感谢您的意见。

我可能会为每个教室、物品、药剂准备一张桌子,然后为每个教室做相当标准的映射

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

这是一个带有项的示例,为您的表提供了一些数据名

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();
        }
    }
公共类ItemMap:ClassMap
{
公共项目映射()
{
带表格(“项目”);
Id(x=>x.Id,“ItemId”).GeneratedBy.Identity();
Map(x=>x.Name);
映射(x=>x.Description);
Map(x=>x.Prefix);
Map(x=>x.后缀);
映射(x=>x.Owner);
Map(x=>x.ItemTypeId);
引用(x=>x.Parent,“ParentItemId”);
HasManyToMany(x=>x.Attributes)
.WithParentKeyColumn(“ItemId”)
.WithChildKeyColumn(“AttributeId”)
.WithTableName(“ItemAttributes”)
.LazyLoad();
}
}

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

我可能会为每个教室、物品、药剂创建一个表,然后对每个进行相当标准的映射

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

这是一个带有项的示例,为您的表提供了一些数据名

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();
        }
    }
公共类ItemMap:ClassMap
{
公共项目映射()
{
带表格(“项目”);
Id(x=>x.Id,“ItemId”).GeneratedBy.Identity();
Map(x=>x.Name);
映射(x=>x.Description);
Map(x=>x.Prefix);
Map(x=>x.后缀);
映射(x=>x.Owner);
Map(x=>x.ItemTypeId);
引用(x=>x.Parent,“ParentItemId”);
HasManyToMany(x=>x.Attributes)
.WithParentKeyColumn(“ItemId”)
.WithChildKeyColumn(“AttributeId”)
.WithTableName(“ItemAttributes”)
.LazyLoad();
}
}

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

这允许您将所有内容都放在一个表中。。。从内存执行此操作,因此语法可能不精确

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);
                    })
公共类ItemMap:ClassMap
{
...
WithTable(“对象”);
Id(x=>x.Id).GeneratedBy.Identity();
Map(x=>x.Name);
映射(x=>x.Description);
...
判别子类子列(“类型”)
.子类(“房间”,x=>
{
x、 地图(r=>r.AreaId);
})
.子类(“项目”,c=>
{
i、 映射(x=>x.Owner);
i、 引用(x=>x.Account).LazyLoad();
HasManyToMany(x=>x.Attributes)
.WithParentKeyColumn(“ItemId”)
.WithChildKeyColumn(“AttributeId”)
.WithTableName(“ItemAttributes”)
.LazyLoad();
});
.子类(“药剂”,x=>
{
x、 Map(p=>p.AmountLeft);
})

这允许您将所有内容都放在一个表中…从内存中执行此操作,因此语法可能不精确

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);
                    })
公共类ItemMap:ClassMap
{
...
WithTable(“对象”);
Id(x=>x.Id).GeneratedBy.Identity();
Map(x=>x.Name);
映射(x=>x.Description);
...
判别子类子列(“类型”)
.子类(“房间”,x=>
{
x、 地图(r=>r.AreaId);
})
.子类(“项目”,c=>
{
i、 映射(x=>x.Owner);
i、 引用(x=>x.Account).LazyLoad();
HasManyToMany(x=>x.Attributes)
.WithParentKeyColumn(“ItemId”)
.WithChildKeyColumn(“AttributeId”)
.WithTableName(“ItemAttributes”)
.LazyLoad();
});
.子类(“药剂”,x=>
{
x、 Map(p=>p.AmountLeft);
})