«PropertyAccessException: Invalid Cast» при попытке получить свойство enum, сохраненное как AnsiString - PullRequest
0 голосов
/ 28 сентября 2011

Мне нужно хранить мои перечисления в базе данных как 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") из сопоставления.

Есть предложения?

Вот хбм:

<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>

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Используя это, добились цели (спасибо @Firo):

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

Глядя на hbm (спасибо @rbellamy за предложение) видно, что использование пользовательского типа sql не переопределяет преобразователь enum изсопоставления, поэтому результирующий 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>

и все работает как надо.

1 голос
/ 29 сентября 2011

По сути, дубликат этого вопроса: Как отобразить перечисление в виде строки в беглом nhibernate?

Разница в том, что вы пытаетесь использовать не-Unicode-строку (NVARCHAR в MSSQL) в качестве базового типа данных.

Итак, как выглядит базовое отображение, сгенерированное FNH?

...