如何使用Nhibernate(和Fluent NHibernate)映射Type

时间:2009-10-04 16:04:40

标签: c# nhibernate fluent-nhibernate

让我说我有类似的东西:

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(用于字符串)

3 个答案:

答案 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)。