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