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

Fluent nhibernate 一列到两个属性的FluentNHibernate映射:这可能吗?,fluent-nhibernate,nhibernate-mapping,Fluent Nhibernate,Nhibernate Mapping,我使用的旧数据库有一个表,其中包含一些示例信息,如下所示: LiabilityType 134 137 140 143 146 999 001 003 006 009 这些代码实际上包含两位信息: 债务是否被归类为 费用或负债(如果代码开始 使用“1”->费用;如果开始 具有“0”->责任 类型 债务(如抵押、丧葬费、透支等) 因此,我希望将此字段映射到实体中的两个属性 我已经研究了ICompositeUserType,但这似乎是关于将两个字段映射到一个(复合)属性,而不是将一个字段映射到两个

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

LiabilityType
134
137
140
143
146
999
001
003
006
009
这些代码实际上包含两位信息:

  • 债务是否被归类为 费用或负债(如果代码开始 使用“1”->费用;如果开始 具有“0”->责任
  • 类型 债务(如抵押、丧葬费、透支等)
  • 因此,我希望将此字段映射到实体中的两个属性

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

    我可以看到如何创建两个实现IUserType的类来检查此字段并将其转换为正确的属性值,但我无法确定该类如何将属性转换回相应的数据库值

    .Where(x => x.ExpenseOrLiability == ExpenseOrLiability.Expense)
    
    这将转换为SQL,如下所示:

    WHERE LiabilityType LIKE '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
    }
    
    或者派生代码

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

    我的问题可能没有明确说明这一点,但我一直打算在类中使用两个单独的属性。我真正想知道的是如何独立查询ExpenseRobability属性,何时这样做需要一个LIKE(而不是=)SQL查询中的运算符。@David通过使代码的内部可查询来解决类似的查询问题。您可以通过反规范化或将它们作为单独的字段存储在数据库中来实现这一点。重要的是通过更新代码或内部属性来保持数据同步,但不能同时更新两者。再次感谢Handcrafter。Unfor我正在使用一个我无法控制其模式的遗留数据库。我永远不会设计这样的数据库模式!