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
。只有您的映射依赖于它。