2012-01-12 79 views
2

在AccountType.cs我:如何使用NHibernate的枚舉工作?

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

在Account.cs我:

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

在我Account.hbm.xml我有

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

我的數據庫表的外觀如:

CREATE TABLE [dbo].[accounts](
    [accountId] [int] IDENTITY(1,1) NOT NULL, 
    [brokerId] [int] NOT NULL, 
    [name] [nvarchar](50) NOT NULL, 
    [nickName] [nvarchar](50) NOT NULL, 
    [accountNumber] [nvarchar](50) NOT NULL, 
    [currency] [char](3) NOT NULL, 
    [accountType] [varchar](10) NOT NULL, 
    [isActive] [bit] NOT NULL, 
    [isDefault] [bit] NOT NULL, 
    [version] [int] NOT NULL, 
CONSTRAINT [PK_accounts] PRIMARY KEY CLUSTERED 
(
    [accountId] ASC 
) 

當我嘗試和測試的帳戶檢索,我得到這個錯誤從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. 

所有我想要做的就是在我的用於驗證應用程序帳戶類型的列表。我不想在我的數據庫中有查找表。任何想法我做錯了什麼?

回答

6

在ACCOUNTTYPE映射具有以下值

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

添加type屬性通過指定ACCOUNTTYPE一個type屬性,我們告訴NHibernate的使用自定義 類.NET類型和數據庫之間的轉換。 NHibernate包含 EnumStringType<T>以覆蓋枚舉值到數據庫 值的轉換,以便存儲字符串名稱,而不是數字值。

1

我覺得NHibernate會默認持久化枚舉爲一個整數(因爲在.net枚舉基本上是語法糖over int),除非你另有說明。如果你真的需要它作爲字符串,那麼你需要實現一個IUserType。一個類似的例子是將字符串映射到布爾值和is covered here

使用枚舉,您只需更改NullSafeGet和NullSafeSet中的邏輯以映射到您的枚舉,可能使用Enum.Parse或TryParse方法。