Я бы, наверное, имел таблицу для каждого класса - Комната, Предмет, Зелье, а затем делал бы довольно стандартные сопоставления для каждого.
Я хотел бы отметить, что в моем собственном опыте было бы плохой идеей назвать ваше поле 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();
}
}
Это, скорее всего, не идеально, так как я не уверен, как будет работать отображение с абстрактным родителем.