我们正在开发一个 NHibernate 项目,我们需要在其中实现 NHibernateIUserType
接口。所以我们做到了,到目前为止它运行良好(我们还没有开始测试该NullSafeSet
方法)。但是,我们有 1 个问题:我们需要知道我们正在映射什么属性才能返回正确的结果。
情况:
我们需要映射的值作为 存储在数据库中int
,我们需要从该值创建一个Code对象。为了能够创建 Code 对象,我们需要string
与前面提到的int
. 这string
是我们正在映射的属性的名称。
我已经发现该names
参数包含属性的 NHibernate SQL 别名(它的形式为:“IS69_6_”)但我不知道这个值是否保持不变(当我调试时它似乎仍然是相同的)。
需要澄清的一些代码: CodeTypeMapper.cs
public class CodeTypeMapper : IUserType
{
public new bool Equals(object x, object y)
{
return x != null && x.Equals(y);
}
public int GetHashCode(object x)
{
return x.GetHashCode();
}
/********** Code relevant to the question: **********/
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var key = (int?)NHibernateUtil.Int32.NullSafeGet(rs, names[0]);
if (key == null) return null;
// So here we need to be able to get the correct code.
// In order to get the correct code, we need the key (fetched above)
// but we also need the name of the property that we are mapping
// which has a dummy value in this example.
Code code = MasterMetaProvider.MasterMeta.GetCode("PropertyName", (int)key);
if (code == null) return null;
// Now that we have the Code object, we can use it to return the proper result
var result = new NetworkObjectEnum((int)key, code.CodeDescEn);
return result;
}
/***************************************************/
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value == null)
{
NHibernateUtil.Int32.NullSafeSet(cmd, null, index);
}
else
{
value = int.Parse(value.ToString());
NHibernateUtil.Int32.NullSafeSet(cmd, value, index);
}
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
public SqlType[] SqlTypes
{
get
{
var types = new SqlType[1];
types[0] = new SqlType(DbType.String);
return types;
}
}
public Type ReturnedType
{
get { return typeof(NetworkObjectEnum); }
}
public bool IsMutable
{
get { return false; }
}
}
NHibernate 映射代码:
// We need this Property's name
Map(x => x.PropertyName).Column("PropertyNameInDB").CustomType<CodeTypeMapper>();
问题:
所以我想问的问题是:是否可以在CodeTypeMapper
类中访问上述属性的名称?
提前致谢。
问候, Yanik Ceulemans
2013 年 9 月 23 日更新:
为了澄清我的问题,我将举一个例子:假设有一个代码表指定了城市、交通类型等......:
+----+-----------+------------+-----------+
| id | code_type | code_value | code_desc |
+----+-----------+------------+-----------+
| 1 | city | 5 | Antwerp |
| 2 | city | 8 | Brussels |
| 3 | city | 1 | Ghent |
| 4 | transport | 1 | boat |
| 5 | transport | 8 | plane |
| 6 | transport | 9 | car |
+----+-----------+------------+-----------+
接下来,我们有一个旅行表,它以下列方式使用此代码表:
+----+------+-------------------+-----------+
| id | city | other_column | transport |
+----+------+-------------------+-----------+
| 1 | 5 | some random value | 1 |
| 2 | 8 | randomness | 8 |
| 3 | 1 | a value | 9 |
+----+------+-------------------+-----------+
如您所见:如果我们想知道代码的描述,我们可以通过查看列名来知道需要从代码表中获取什么值,以及从旅行表中该列中的值。
c# 类Travel
可能看起来像这样:
public class Travel
{
public int Id { get; set; }
public int City { get; set; }
public string OtherColumn { get; set; }
public int Transport { get; set; }
}
所以我的问题是:在映射 Travel 类时,是否有可能IUserType
在运行时在实现中获取属性名称“city”,以便能够从代码表中获取正确的值?(注意:我无法更改数据库设计。)