0

我需要将我的枚举作为 varchar 而不是 nvarchar 存储在数据库中,所以我使用“AnsiString”映射如下:

public class Document
{
    public virtual int Id { get; set; }
    public virtual string Content { get; set; }
    public virtual DocType Type { get; set; }
}

public enum DocType
{
    Word,
    Excel
}

public class DocumentMap : ClassMap<Document>
{
    public DocumentMap()
    {
        Id(d => d.Id);
        Map(d => d.Content);
        Map(d => d.Type).CustomType("AnsiString");
    }
}

保存到数据库可以正常工作,但是在检索时我收到一个错误: NHibernate.PropertyAccessException: Invalid Cast (检查你的映射是否有属性类型不匹配); Core.Document 的设置器

当我从映射中删除CustomType("AnsiString")时,它工作正常。

有什么建议么?

这是hbm:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" name="Core.Document, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Document`">
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="identity" />
    </id>
    <property name="Content" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Content" />
    </property>
    <property name="Type" type="AnsiString">
      <column name="Type" />
    </property>
  </class>
</hibernate-mapping>
4

2 回答 2

1

本质上是这个问题的重复:How do you map an enum as string in fluent nhibernate?

不同之处在于您尝试使用非 Unicode 字符串(MSSQL 中的 NVARCHAR)作为基础数据类型。

那么,FNH 生成的底层映射是什么样的呢?

于 2011-09-28T23:03:10.193 回答
1

使用它就可以了(感谢@Firo):

Map(d => d.Type).CustomSqlType("varchar(50)");

查看 hbm(感谢@rbellamy 的建议)表明使用自定义 sql 类型不会覆盖映射中的枚举映射器,因此生成的 hbm 如下所示:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" name="Core.Document, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Document`">
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="identity" />
    </id>
    <property name="Content" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Content" />
    </property>
    <property name="Type" type="FluentNHibernate.Mapping.GenericEnumMapper`1[[Core.DocType, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], FluentNHibernate, Version=1.3.0.717, Culture=neutral, PublicKeyToken=8aa435e3cb308880">
      <column name="Type" sql-type="varchar(50)" />
    </property>
  </class>
</hibernate-mapping>

一切正常。

于 2011-09-29T00:01:10.610 回答