2012-01-12 5 views
2

NHibernateで列挙型を扱うには?私が持っているAccountType.csで

Account.csで
namespace MooDB.Domain 
{ 
    public enum AccountType {Real, Demo, Fictional}; 
} 

私が持っている:私のAccount.hbm.xmlで

public class Account : Entity 
{   
    public virtual int Id { get; set; } 
    public virtual Broker Broker { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string NickName { get; set; } 
    public virtual string AccountNumber { get; set; } 
    public virtual Currency Currency { get; set; } 
    public virtual AccountType AccountType { get; set; } 
    public virtual bool IsActive { get; set; } 
    public virtual bool IsDefault { get; set; } 
} 

を私は

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="MooDB" 
        namespace="MooDB.Domain"> 

    <class name="MooDB.Domain.Account,MooDB" table="accounts"> 
    <id name="Id" column="accountId" type="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <version name="Version" column="version" type="integer" unsaved-value="0" /> 
    <many-to-one name ="Broker" column="brokerId" not-null="true" class="MooDB.Domain.Broker,MooDB" /> 
    <property name="Name" column="`name`" type="String" length="50" not-null="true" /> 
    <property name="NickName" column="nickName" type="String" length="50" not-null="true" /> 
    <property name="AccountNumber" column="accountNumber" type="String" length="50" not-null="true" /> 
    <many-to-one name ="Currency" column="currency" not-null="true" class="MooDB.Domain.Currency,MooDB" /> 
    <property name="AccountType" column="accountType" /> 
    <property name="IsActive" column="isActive" type="bool" not-null="true" /> 
    <property name="IsDefault" column="isDefault" type="bool" not-null="true" /> 
    </class> 
</hibernate-mapping> 

私のデータベーステーブルのルックスを持っていますlike:

私がしようとすると、アカウントの取得をテストするとき、私はNHibernateはこのエラーを取得:

Test 'Test.RepoTest.CanGetAccountById' failed: NHibernate.Exceptions.GenericADOException : could not load an entity: [MooDB.Domain.Account#1][SQL: SELECT account0_.accountId as accountId3_0_, account0_.version as version3_0_, account0_.brokerId as brokerId3_0_, account0_.[name] as name4_3_0_, account0_.nickName as nickName3_0_, account0_.accountNumber as accountN6_3_0_, account0_.currency as currency3_0_, account0_.accountType as accountT8_3_0_, account0_.isActive as isActive3_0_, account0_.isDefault as isDefault3_0_ FROM accounts account0_ WHERE account0_.accountId=?] 
    ----> System.FormatException : Input string was not in a correct format. 

私がやりたいすべてが検証目的のために自分のアプリケーションでのアカウントの種類のリストを持っています。私は自分のDBにルックアップテーブルを持っていたくない。私が間違っていることは何ですか?

答えて

6

がAccountTypeためtype属性を指定することで、次の値

NHibernate.Type.EnumStringType`1[[MooDB.Domain.AccountType, MooDB]], NHibernate 

type属性を追加し、我々は、.NETの型とデータベースの間の変換のためのカスタム クラスを使用するNHibernateのを教えてください。 NHibernateの文字列名が格納されるように数値、データベース 値に列挙値の変換をしないオーバーライドする EnumStringType<T>を含みます。

1

私は(.NET列挙型にint型の上に基本的にシンタックスシュガーなので)あなたがそうでなければ、それを教えてくれない限り、NHibernateのは、整数として列挙型を永続化をデフォルトと思います。文字列であることが本当に必要な場合は、IUserTypeを実装する必要があります。同様の例は、文字列をブール値にマッピングし、is covered hereにマッピングすることです。

enumsでは、NullSafeGetとNullSafeSetのロジックを変更して、enum.ParseメソッドまたはTryParseメソッドを使用してenumにマップするだけで済みます。 AccountTypeマッピングで

関連する問題