我需要将我的枚举存储在数据库中作为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:无效的转换(检查映射是否存在属性类型不匹配); Core.Document的setter
当我从映射中删除 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>
答案 0 :(得分:1)
基本上是这个问题的副本:How do you map an enum as string in fluent nhibernate?
不同之处在于您尝试使用非Unicode字符串(MSSQL中的NVARCHAR)作为基础数据类型。
那么,FNH生成的底层映射是什么样的?
答案 1 :(得分: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>
并且所有工作都应该如此。