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

Dav*_*vid 5 nhibernate-mapping fluent-nhibernate

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

LiabilityType
134
137
140
143
146
999
001
003
006
009
Run Code Online (Sandbox Code Playgroud)

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

  1. 债务是否归类为费用或负债(如果代码以“1”开头 -> 费用;如果以“0”开头 -> 负债
  2. 债务类型(例如抵押贷款、丧葬费、透支等)

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

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

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

.Where(x => x.ExpenseOrLiability == ExpenseOrLiability.Expense)
Run Code Online (Sandbox Code Playgroud)

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

WHERE LiabilityType LIKE '1%'.
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?

Han*_*man 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
}
Run Code Online (Sandbox Code Playgroud)

或者导出代码

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; }
Run Code Online (Sandbox Code Playgroud)