Отображение Nhibernate: инкапсуляция списка в объекте - PullRequest
1 голос
/ 01 июня 2009

У меня есть две таблицы Deal и Cost. Затраты могут быть нескольких типов, например, плановые, незапланированные. Каждая сделка может иметь только одну стоимость каждого типа. Это достаточно легко отобразить как много-к-одному в сделке, что приводит к списку затрат. Но я хочу создать объект затрат с именованными свойствами для каждой стоимости. Так что для базы данных, которая выглядит так:

Deal:               Cost
ID   Name           ID   DealID   Type        Value
---------           -------------------------------
1    Test           1    1        Planned     10
                    2    1        Unplanned   5

это доступно вот так

Deal.Costs.Planned = 10m;
Deal.Costs.Unplanned = 5m;

Как лучше всего составить карту? Должен ли я даже отображать его или просто написать свойства вручную, чтобы запросить базовую коллекцию?

Сложность, на мой взгляд, заключается в сопоставлении свойств стоимости с тем, чтобы они отображались в разные строки в одной и той же таблице. Использование одного из столбцов в качестве дискриминатора.

Ответы [ 4 ]

0 голосов
/ 01 июня 2009

Вы можете иметь свойства формулы в своем классе, используя тег Formula в NHibernate mapping. Формула - это просто оператор SQL, который будет вставлен как подзапрос в запрос на отображение. Очевидно, что свойства формулы доступны только для чтения и не могут быть обновлены.

Поскольку вы хотите рассчитать эти свойства для каждой сделки, вы должны добавить их как свойства сделки (если вы хотите использовать формулу), таким образом, у вас будет:

Deal.UnPlannedCosts
Deal.PlannedCosts

Вот статья , которая объясняет свойства формулы.

0 голосов
/ 01 июня 2009

Запишите свойства методы вручную:

public class Deal
{
    public virtual Cost GetPlannedCost() 
    {
        return _costs.FirstOrDefault(x => x.IsPlanned()); 
    }

    public virtual Cost GetUnplannedCost() {}
    {
        return _costs.FirstOrDefault(x => x.IsUnplanned()); 
    }

    public virtual Cost[] GetAllCosts() 
    {
        return _costs.ToArray(); 
    }

    private ISet<Cost> _costs = new HashedSet<Cost>();
}
0 голосов
/ 01 июня 2009

Я бы отобразил затраты как частную коллекцию и выставил бы запланированные и незапланированные расходы на сделку. Это позволит вам применять в качестве бизнес-правила «Каждая сделка может иметь только одну стоимость каждого типа». Это будет выглядеть примерно так:

public class Deal
{
    private IList<Cost> _costs = new List<Cost>(2); // map this collection

    public Cost PlannedCost
    {
        get { return _costs.FirstOrDefault(c => c.Type == CostType.Planned); }
        set
        {
            var plannedCost = _costs.FirstOrDefault(c => c.Type == CostType.Planned);
            if (plannedCost != null)
            {
                _costs.Remove(plannedCost);
            }
            _costs.Add(value);
        }
    }

    public Cost UnplannedCost { // similarly }
}
0 голосов
/ 01 июня 2009

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

Я бы отобразил стоимость как собственность на сделку. Если вы хотите сохранить синтаксис Deal.Costs.Planned, вы можете использовать сопоставление компонентов.

...