我使用的旧数据库有一个表格,其中包含如下所示的一些示例信息:
LiabilityType
134
137
140
143
146
999
001
003
006
009
这些代码实际上包含两位信息:
因此,我想将此字段映射到我的实体中的两个属性。
我查看了ICompositeUserType,但这似乎是关于将两个字段映射到一个(复合)属性,而不是将一个字段映射到两个属性。
我可以看到如何创建两个实现IUserType的类来检查这个字段并将其转换为正确的属性值,但我无法弄清楚类如何将属性转换回适当的数据库值。例如,我想映射这个,以便我可以创建一个linq查询,我可以说;
.Where(x => x.ExpenseOrLiability == ExpenseOrLiability.Expense)
,这将转换为SQL,如下所示:
WHERE LiabilityType LIKE '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; }