2009-06-01 59 views
1

我有两个表DealCost。成本可以是多种类型,例如计划,未计划。每笔交易只能有一种成本。这很容易就可以映射成交易的多对一方式,从而得到成本的IList。但我想要的是创建一个为每个成本命名属性的成本对象。因此,对于看起来像这样一个数据库:Nhibernate映射:在一个对象内封装一个列表

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; 

访问的是如何去映射的最佳方式?我是否应该映射它,还是应该手动编写属性来查询基础集合?

我看到它的困难是映射成本的属性,以便它们映射到同一个表中的不同行。使用其中一列作为鉴别器。

回答

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

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

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

+0

这很有道理。但是,我怎么能够从组件映射中为列表的每个属性选择Costs表中的不同行,我需要设置某种鉴别器,但我从来没有见过这样做。 – 2009-06-01 11:26:57

+0

如果您将成本映射为交易属性,那么您需要将外键添加到交易表中。我假设你有控制数据库。 – 2009-06-01 11:35:56

0

我将映射成本私人收藏和揭露计划和计划外的交易成本。这将允许您强制执行“每笔交易只能有一种成本”作为业务规则。这将是这个样子:

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

您可以使用NHibernate mapping.A公式公式标签类有公式的属性很简单,就是将被插入在映射查询子查询的SQL语句。 显然,公式属性是只读的,无法更新。

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

​​

Here的解释文章配方属性。

相关问题