0

列挙型をnvarcharではなくvarcharとしてデータベースに保存する必要があるため、次のように「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のセッター

マッピングから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

本質的にこの質問の複製:流暢な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 に答える