我有两张表Deal
和Cost
。成本可以是多种类型,例如计划,计划外。每笔交易都可以只有一种每种类型的成本。这很容易映射成多对一的交易,导致成本的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;
如何最好地映射这个?我是否应该映射它,还是应该手动编写属性来查询底层集合?
我看到的困难是映射成本属性,以便它们映射到同一个表中的不同行。使用其中一列作为鉴别器。
答案 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是一篇解释公式属性的文章。