Вопрос картографирования NHibernate - PullRequest
1 голос
/ 21 июня 2009

Я пробовал разные подходы к картированию следующей структуры, но, наконец, признаю, что после дня, когда я не слишком далеко, мне нужна помощь.

Итак, вопрос в том, как бы вы, ребята, пошли на картирование чего-то подобного. На этом этапе схема не зафиксирована.

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 голосов
/ 20 августа 2009

Это позволяет вам хранить все в одной таблице ... делая это из памяти, поэтому синтаксис может быть не точным.

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);
                    })
0 голосов
/ 20 августа 2009

Я бы, наверное, имел таблицу для каждого класса - Комната, Предмет, Зелье, а затем делал бы довольно стандартные сопоставления для каждого.

Я хотел бы отметить, что в моем собственном опыте было бы плохой идеей назвать ваше поле 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();
        }
    }

Это, скорее всего, не идеально, так как я не уверен, как будет работать отображение с абстрактным родителем.

...