代码之家  ›  专栏  ›  技术社区  ›  David

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

  •  4
  • David  · 技术社区  · 14 年前

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

    LiabilityType
    134
    137
    140
    143
    146
    999
    001
    003
    006
    009
    

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

    1. 债务是否属于 “1”->费用;如果它开始 “0”->责任
    2. 类型

    因此,我想将此字段映射到实体中的两个属性。

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

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

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

    它将被转换成如下SQL:

    WHERE LiabilityType LIKE '1%'.
    

    这样的事情有可能吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Handcraftsman    14 年前

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

    要防止值不同步,必须从另一个值派生一个值。例如,导出局部剖分:

    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
    }
    

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