让我说我有类似的东西:
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映射属性TypeOfContent(也可以欣赏流畅的映射)?
我会将类型约束为C# Built-In Types,例如string,int,datetime等。所以我想在数据库中存储System.String(用于字符串)
答案 0 :(得分:2)
我很好奇,你为什么不这样做呢
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>();
}
答案 1 :(得分:2)
我想知道这是否有点被推翻。你能不能简单地将类型映射为属性?
public class DataTypeMap : ClassMap<DataType>
{
public DataTypeMap()
{
// ...
Map(x => x.TypeOfContent);
}
}
在sqlite中至少会映射到TEXT列,该列将存储AssemblyQualifiedName。
相关的hbm.xml在这里:
<property name="Type" type="System.Type, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Type" />
</property>
如何优雅地映射默认值的其他问题也是我感兴趣的。在sqlite中至少there is no 'strong-typing' of a column(我可能使用了错误的术语,请参阅链接)所以在数据库级别至少应该可以简单地拥有一个对象DefaultValue和persist / depersist而不会损失精度。但是,it remains an open question as to how to create a mapping for this that NHibernate will understand。
答案 2 :(得分:0)
我会尝试回答我自己的问题,但我希望还有另一种(更简单/更清洁)的方式。
我想我可以将属性TypeOfContent的类型更改为类似BuiltInType(自定义类型包装类)的类型,以便它可以实现IUserType。
然后我可以使用这种技术:http://blog.jagregory.com/2009/01/11/fluent-nhibernate-auto-mapping-type-conventions/
编辑1: 我不喜欢这个解决方案因为它迫使我在我的模型上的NHibernate上添加一个依赖项(IUserType)。