2011-03-01 59 views
3

我開始與Nhibernate和Oracle合作開展一個項目。
數據庫是Oracle 9.2,我無法更改架構或任何東西。
我使用NH3.0和Oracle.DataAccess.dll版本2.111.7.20。如何在Nhibernate中定義CHAR(ORACLE)列?

到目前爲止,我已經映射了幾個表並做了一些查詢。一切工作都很好。 我現在碰到一個問題,我不知道如何解決它。
設計數據庫的公司認爲將所有字母數字字段創建爲CHAR而不是VARCHAR或VARCHAR2是一個好主意。

我已經將所有這些列映射爲字符串,並且我的類已定義了字符串字段。 後來我試圖通過在Oracle中定義爲CHAR(10)的主鍵加載實體。 我試圖加載的密鑰長度只有7個字符
EG:'CI00252' 顯然我的實體無法加載。 用NHProf分析查詢我可以看到我的查詢很好,如果我嘗試在Oracle Sql-Developer中執行它,我會得到結果集。 如果我像我這樣'CI00252'填充我的字符串,我只能設法使它工作。

考慮到數據庫上定義的大多數字段都是CHAR,在執行查詢之前,我無法填充所有內容。
我能做些什麼來解決這個問題? PS:我見過一些其他人也有同樣的問題,但我找不到合適的答案。

UPDATE

我正在讀一blog這傢伙也有類似的問題,另一個數據type.I've試圖adpapt代碼

public SqlType[] SqlTypes 
    { 
     get 
     { 
       SqlType[] types = new SqlType[1]; 
       types[0] = new SqlType(DbType.StringFixedLength); 
       return types; 
       } 
    } 

**

,顯然,一切正常,但...我不知道爲什麼。

using System; 
using System.Data; 
using NHibernate; 
using NHibernate.SqlTypes; 
using NHibernate.UserTypes; 

namespace ConsoleOracleNhibernate.OracleTypes 
{ 
    public class CharUserType : IUserType 
    { 
     public object NullSafeGet(IDataReader rs, string[] names, object owner) 
     { 
      string resultString = (string)NHibernateUtil.String.NullSafeGet(rs, names[0]); 
      if (resultString != null) 
       return resultString.Trim(); 
      return null; 
     } 

     public void NullSafeSet(IDbCommand cmd, object value, int index) 
     { 
      if (value == null) 
      { 
       NHibernateUtil.String.NullSafeSet(cmd, null, index); 
       return; 
      } 

      value = ((String)value).Trim(); 

      NHibernateUtil.String.NullSafeSet(cmd, value, index); 
     } 

     public object DeepCopy(object value) 
     { 
      if (value == null) return null; 
      return string.Copy((String)value); 
     } 

     public object Replace(object original, object target, object owner) 
     { 
      return original; 
     } 

     public object Assemble(object cached, object owner) 
     { 
      return DeepCopy(cached); 
     } 

     public object Disassemble(object value) 
     { 
      return DeepCopy(value); 
     } 

     public SqlType[] SqlTypes 
     { 
      get 
      { 
       SqlType[] types = new SqlType[1]; 
       types[0] = new SqlType(DbType.StringFixedLength); 
       return types; 
      } 
     } 

     public Type ReturnedType 
     { 
      get { return typeof(String); } 
     } 

     public bool IsMutable 
     { 
      get { return false; } 
     } 

     public new bool Equals(object x, object y) 
     { 
      if (x == null || y == null) return false; 
      return x.Equals(y); 
     } 

     public int GetHashCode(object x) 
     { 
      return x.GetHashCode(); 
     } 
    } 
} 

和我的映射:

<key-property name="CustomerCode" column="ANCOCO" type="ConsoleOracleNhibernate.OracleTypes.CharUserType, ConsoleOracleNhibernate" length="10"></key-property> 

是否有任何人在這裏誰可以試着幫我明白髮生了什麼?

+0

好問題。我知道正確的[DbType](http://msdn.microsoft.com/en-us/library/system.data.dbtype.aspx)將是'DbType.StringFixedLength',但我不確定這是如何映射休眠。 – Powerlord 2011-03-01 16:46:04

+0

感謝R.Bemrose爲你的答案。我得到了相同的結論,但我不知道在哪裏定義。我找到了一個可行的解決方案,但我不知道爲什麼。 – LeftyX 2011-03-01 17:26:49

回答

1

我的回答是在問題的更新。