繁体   English   中英

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

[英]How to map Type with Nhibernate (and 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#内置类型,例如字符串,整数,日期时间等。因此,我想将System.String(用于字符串)存储在数据库中

我很好奇,为什么不这样做

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>();
}

我想知道这是否被过度考虑了。 您不能简单地将类型映射为属性吗?

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中至少没有一列的“强类型” (我可能使用了错误的术语,请参见链接),因此至少在数据库级别上应该可以简单地拥有一个对象DefaultValue并在不使用的情况下进行持久/分散操作精度损失。 但是, 对于如何为NHibernate理解的映射创建一个悬而未决的问题

我将尝试回答我自己的问题,但我希望有另一种(更简单/更简便)的方法。

我想我可以将TypeOfContent属性的类型更改为BuiltInType(自定义Type包装器类),以便可以实现IUserType。

然后,我可以使用这种技术: http : //blog.jagregory.com/2009/01/11/fluent-nhibernate-auto-mapping-type-conventions/

编辑1: 我不喜欢这种解决方案,因为它迫使我在模型上添加对NHibernate的依赖项(IUserType)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM