NHibernate-将多个数据库列映射到一个对象

NHibernate-将多个数据库列映射到一个对象,nhibernate,Nhibernate,我有一个数据库(无法更改),其中包含一整批存储在两列中的值: 当前,每个列都映射到一个属性,我的域对象如下所示: int? Value1 bool IsValue1RealValue string Value2 bool IsValue2RealValue bool? Value3 bool IsValue3RealValue 我想把它们放入一个ValueType中,它可以保存2或3个值: -值(存储在对象或T中) -布尔值“RealValue” -和(可选).NET属性名称的名称 目前,

我有一个数据库(无法更改),其中包含一整批存储在两列中的值:

当前,每个列都映射到一个属性,我的域对象如下所示:

int? Value1
bool IsValue1RealValue

string Value2
bool IsValue2RealValue

bool? Value3
bool IsValue3RealValue
我想把它们放入一个ValueType中,它可以保存2或3个值:

-值(存储在
对象
T
中)
-布尔值“RealValue”
-和(可选).NET属性名称的名称

目前,我有以下NHibernate映射:

  Component(x => x.Value1, fdf =>
  {
     fdf.Map(f => f.Value).Column("Value1");
     fdf.Map(f => f.IsRealValue).Column("IsValue1RealValue");
  });
Value1
具有以下类型:

public class FlaggedNullableIntValue
{
    public int? Value;
    public bool IsRealValue;
}
我的域对象将如下所示:

public class DomainEntity
{
    public virtual FlaggedNullableIntValue Value1;
    public virtual FlaggedStringValue Value2;
    public virtual FlaggedNullableBooleanValue Value3;
}

我想知道沿着这条路走得更远是不是一个好主意,或者是否有另一种结构更适合我的需要

我认为你的思路完全正确。一个建议-您应该能够将
FlaggedNullable*值
类设置为通用类,这样您就不必创建大量不同的类

public class FlaggedNullableValue<T>
    where T : struct
{
    public T? Value;
    public bool IsRealValue;
}
public类FlaggedNullableValue
其中T:struct
{
公共价值观;
公共价值观;
}

看起来您正在使用Fluent NHibernate指定映射。只要这些列对的命名方式保持一致,就应该能够创建一个约定,以减轻映射所有这些属性和列名的负担。

我想我不明白。你希望你的模特看起来怎么样?如果
值的类型为
int?
,则存在那些
T
对象
?你想映射什么属性名称?我已更新了我的问题。对于数据库中的每个值+IsRealValue组合,该模型将有1个属性。值当前仍为int,但理想情况下,映射对象将能够将int、bool和字符串作为值的类型处理。您是否询问nHibernate是否具有转换行(对象)中的列的功能?如果是这样,我很确定这是不可能的。您必须手动映射每一对。您只能将一个DB列映射到一个属性,这是NHibernate的
限制
(如果这是限制)@Rippo,实际上,使用@Laoujin演示的组件是将多个列映射到一个属性的一种方法。另一种方法是定义一个
ICompositeUserType
。我们最终使用了
ICompositeUserType
(根据您的评论)。到目前为止,它运行得很好。