C# 如何使用Nhibernate(和Fluent Nhibernate)映射类型
假设我有类似的东西:C# 如何使用Nhibernate(和Fluent Nhibernate)映射类型,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,假设我有类似的东西: public class DataType { //For NHibernate private DataType(){} public DataType(string name, Type type, string defaultValue) { Name = name; TypeOfContent = type; DefaultInvariantStringValue = defaultV
public class DataType
{
//For NHibernate
private DataType(){}
public DataType(string name, Type type, string defaultValue)
{
Name = name;
TypeOfContent = type;
DefaultInvariantStringValue = defaultValue;
}
public string Name { get; set; }
public Type TypeOfContent { get; set; }
public string DefaultInvariantStringValue { get; set; }
}
如何将内容的属性类型映射到NHibernate(也希望映射流畅)
我会将类型限制为string、int、datetime等,因此我希望将System.string(用于字符串)存储在数据库中我会尝试回答我自己的问题,但我希望有另一种(更简单/更干净的)方法 我想我可以将属性TypeOfContent的类型更改为BuiltType(一个自定义类型包装类),这样它就可以实现IUserType 然后我可以使用这种技术:
编辑1:我不喜欢这个解决方案因为它迫使我在我的模型上添加对NHibernate的依赖项(IUserType)。我很好奇,你为什么不改为这样做
public class DataType
{
...
private string _typeOfContent;
public virtual Type TypeOfContent
{
get { return Type.GetType(_typeOfContent); }
set { _typeOfContent = value.FullName; }
}
}
...
public class DataTypeMap : ClassMap<DataType>
{
Map(x => x.TypeOfContent)
.Access.CamelCaseField(Prefix.Underscore)
.CustomType<string>();
}
公共类数据类型
{
...
私有字符串(内容的类型);
公共虚拟类型内容类型
{
获取{return Type.GetType(_-typeOfContent);}
设置{u typeOfContent=value.FullName;}
}
}
...
公共类DataTypeMap:ClassMap
{
地图(x=>x.TypeOfContent)
.Access.CamelCaseField(前缀.下划线)
.CustomType();
}
我想知道这是不是有点过虑了。您不能简单地将类型映射为属性吗
public class DataTypeMap : ClassMap<DataType>
{
public DataTypeMap()
{
// ...
Map(x => x.TypeOfContent);
}
}
公共类DataTypeMap:ClassMap
{
公共数据类型映射()
{
// ...
地图(x=>x.TypeOfContent);
}
}
在sqlite中,至少这将映射到一个文本列,该列将存储AssemblyQualifiedName
相关的hbm.xml如下所示:
<property name="Type" type="System.Type, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Type" />
</property>
我还感兴趣的是如何优雅地映射默认值。至少在sqlite中(我可能使用了错误的术语,请参阅链接),因此在数据库级别,至少应该可以简单地使用对象DefaultValue和persist/depersist,而不损失精度。但是,.我会为每种类型创建一个不同的数据类型类,并删除字符串。我认为您弄错了-您的域模型不依赖于
IUserType
。只有您的映射依赖于它。