Nhibernate映射:在对象中封装列表

时间:2009-06-01 11:13:59

标签: nhibernate nhibernate-mapping

我有两张表DealCost。成本可以是多种类型,例如计划,计划外。每笔交易都可以只有一种每种类型的成本。这很容易映射成多对一的交易,导致成本的IList。但我想要的是创建一个为每个成本命名属性的成本对象。因此对于看起来像这样的数据库:

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 :(得分:0)

这对我来说听起来并不像费用是一个列表。

我会将Cost映射为Deal上的属性。如果您想保留Deal.Costs.Planned语法,可以使用组件映射。

答案 1 :(得分:0)

手写属性方法:

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

答案 2 :(得分:0)

我会将Costs映射为私人收藏,并在Deal上显示计划成本和计划外成本。这将允许您强制执行“每笔交易可以只有一种每种类型的成本”作为业务规则。它看起来像这样:

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

答案 3 :(得分:0)

您可以使用NHibernate映射的公式标记在您的类中拥有公式属性。公式只是一个SQL语句,将作为子查询插入到映射查询中。 显然,公式属性是只读的,无法更新。

由于您要为每笔交易计算这些属性,您应该将它们添加为交易属性(如果您想使用公式),那么您将拥有:

Deal.UnPlannedCosts
Deal.PlannedCosts

Here是一篇解释公式属性的文章。