FluentNHibernate将一列映射到两个属性:这可能吗?

时间:2010-11-25 15:23:41

标签: fluent-nhibernate nhibernate-mapping

我使用的旧数据库有一个表格,其中包含如下所示的一些示例信息:

LiabilityType
134
137
140
143
146
999
001
003
006
009

这些代码实际上包含两位信息:

  1. 债务是否归类为 费用或责任(如果代码开始 '1' - >费用;如果它开始 '0' - >责任
  2. 的类型     债务(例如抵押,丧葬费,透支等)
  3. 因此,我想将此字段映射到我的实体中的两个属性。

    我查看了ICompositeUserType,但这似乎是关于将两个字段映射到一个(复合)属性,而不是将一个字段映射到两个属性。

    我可以看到如何创建两个实现IUserType的类来检查这个字段并将其转换为正确的属性值,但我无法弄清楚类如何将属性转换回适当的数据库值。例如,我想映射这个,以便我可以创建一个linq查询,我可以说;

    .Where(x => x.ExpenseOrLiability == ExpenseOrLiability.Expense)
    

    ,这将转换为SQL,如下所示:

    WHERE LiabilityType LIKE '1%'.
    

    这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

我们通过非规范化来处理这种情况。将代码和债务分类类型存储在单独的字段中。这允许您向用户呈现代码,但在查询中使用其内在函数。

要防止值不同步,您必须从另一个派生出一个。例如,派生突破:

public virtual LiabilityType LiabilityType { get; set; }
public virtual ExpenseOrLiability ExpenseOrLiability
{ 
    get
    {
        return // extract ExpenseOrLiability from LiabilityType
    }
    set{} // ignore set
}
public virtual DebtType DebtType
{ 
    get
    {
        return // extract DebtType from LiabilityType
    }
    set{} // ignore set
}

OR派生代码

public virtual LiabilityType LiabilityType 
{
   get
    {
       return // combine ExpenseOrLiability with DebtType somehow
    } 
   set { } // ignore set
}

public virtual ExpenseOrLiability ExpenseOrLiability { get; set; }
public virtual DebtType DebtType { get; set; }