Свободный NHibernate - Отображение словаря объектов типа компонента / значения как HasMany - PullRequest
4 голосов
/ 08 июня 2010

У меня есть класс, Item, который имеет много Rates.Они обозначены перечислением, RateType.

public class Item
{
    int Id {get;set;}
    IDictionary<RateType, Rate> Rates {get;set;}
    // some other stuff
}

public class Rate
{
    RateType Type {get;set;}
    decimal Amount {get;set;}
    decimal Quantity {get;set;}
}

Я переопределяю свое отображение таким образом:

public void Override(FluentNHibernate.Automapping.AutoMapping<Item> mapping)
{
    mapping.HasMany(x => x.Rates)
        .AsMap(x => x.Type)
        .KeyColumns.Add("Item_Id")
        .Table("InvoiceItem_Rates")
        .Component(x => x.Map(r => r.Amount))
        .Component(x => x.Map(r => r.Quantity))
        .Cascade.AllDeleteOrphan()
        .Access.Property();
}

Это имеет две проблемы с ним.

1) Когда я выбираю элемент, Type помещается в качестве ключа словаря без проблем.Однако оно не присваивается свойству Type в Rate.

2) Я ожидаю три столбца в таблице InvoiceItem_Rates (Item_Id, Type, Quantityи Amount. Однако Amount подозрительно отсутствует.

Почему эти вещи происходят? Что я делаю не так?

1 Ответ

3 голосов
/ 08 июня 2010

По моему мнению, это не идеально, поскольку значение ключа enum на самом деле хранится как целое число, а не строка, но, вероятно, это не проблема.Ключевым моментом здесь является то, что вы не можете иметь несколько вызовов компонента, так как он перезапишет ваш предыдущий вызов компонента тем, что есть последний.Правильный способ вызова Component (), как показано ниже:

        Id(x => x.Id);
        HasMany(x => x.Rates)
            .AsMap(x => x.Type)
            .KeyColumn("Item_Id")
            .Table("InvoiceItem_Rates")
            .Component(x =>
                           {
                               x.Map(r => r.Amount);
                               x.Map(r => r.Quantity);
                           })
            .Cascade.AllDeleteOrphan();            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...