2016-11-23 4 views
2

Nhibernateを新しくしました。 私が作成したプログラムを実行しようとすると、このエラーが発生します。 "'Post_OfficeProxy'タイプのオブジェクトを 'System.String'と入力することができません。"nhibernateのテーブルとカスタムタイプの結合

DBテーブルは

POSTOFFICE.POST_OFFICE (PO_CODEチャー(8)、PO_NAME、PO_ADD)

POSTOFFICE.RECEIPT_BOOK(BOOK_NO、PO_CODEチャー(7)、ADD_DATE、ADD_USERあります、ADD_IP_ADDRESS)

PO_CODE列は、同じデータが含まれていますが、私が欲しいの外部キーが定義されていない 結果が BOOK_NO、PO_CODE、PO_NAMEを含むグリッドです、ADD_DATE、ADD_USER、ADD_IP_ADDRESSを指定します。

Post_Office.hbm.xmlファイル

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Postal" namespace="Postal.Models"> <class name="Post_Office" table="POSTOFFICE.POST_OFFICE" lazy="true" > 
<id name="PO_CODE" column="PO_CODE" /> 
<property name="PO_NAME"> 
    <column name="PO_NAME" sql-type="VARCHAR2" not-null="true" /> 
</property> 
<property name="PO_ADD"> 
    <column name="PO_ADD" sql-type="VARCHAR2" not-null="false" /> </property> </class></hibernate-mapping> 

Reciept.hbm.xmlファイル

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Postal" namespace="Postal.Models"> 
    <class name="Reciept" table="POSTOFFICE.RECEIPT_BOOK" lazy="true" > 

    <id name="Book_no" column="BOOK_NO" /> 

    <many-to-one name="po_code" class="Post_Office" column="PO_CODE" cascade="none" /> 
    <property name="Add_date"> 
     <column name="ADD_DATE" sql-type="DATE" not-null="false" /> 
    </property> 

    <property name="Add_user"> 
     <column name="ADD_USER" sql-type="VARCHAR2" not-null="false" /> 
    </property> 

    <property name="Add_ip_address"> 
     <column name="ADD_IP_ADDRESS" sql-type="VARCHAR2" not-null="false" /> 
    </property> 


    </class> 
</hibernate-mapping> 

二つのクラス

using System.Linq; 
using System.Web; 
namespace Postal.Models 
{ 
    public class Post_Office 
    { 
     [Key] 
     [Required] 
     [Display(Name = "PO code : ")] 
     public virtual string PO_CODE { get; set; } 

     [Required] 
     [Display(Name = "PO Name : ")] 
     public virtual string PO_NAME { get; set; } 

     [Display(Name = "PO Address : ")] 
     public virtual string PO_ADD { get; set; } 
    } 
} 


public class Reciept 
    { 


     [Key] 
     [Required] 
     [Display(Name = "Book No. : ")] 
     public virtual string Book_no { get; set; } 

     [Required] 
     [Display(Name = "PO code : ")] 
     public virtual string po_code { get; set; } 
    [Display(Name = "Add Date : ")] 
    public virtual DateTime? Add_date { get; set; } 

    [Display(Name = "Add User. : ")] 
    public virtual string Add_user { get; set; } 

    [Display(Name = "IP Address : ")] 
    public virtual string Add_ip_address { get; set; } 
} 

DALのクラスで機能

public IList<Reciept> Get_Records(string po_code) 
     { 
      IList<Reciept> p = null; 
      using (ISession session = OpenSession()) 
      { 
       Reciept d = null; 
       Post_Office dt = null; 

       try 
       { 
        p = session.QueryOver<Reciept>(() => d) 
         .JoinAlias(() => d.po_code,() => dt) 
         //.Where(() => dt.PO_CODE == "PD06003") 
         .List<Reciept>(); 
       } 
       catch (Exception rd) 
       { } 

      } 
      return p; 
     } 

誰かが私を正しい方向に導くことができますか?事前ごJoinAliasで

+0

ポールのソリューションは、私にはよさそうだが、あなたはそれでいる間、あなたも(問題とは無関係の)領収書のクラスのスペルを修正したい場合があります。 –

答えて

3
p = session.QueryOver<Reciept>(() => d) 
        .JoinAlias(() => d.po_code,() => dt) 
        //.Where(() => dt.PO_CODE == "PD06003") 
        .List<Reciept>(); 

のおかげで、あなたはタイプPost_Officeの対象である別名dtに文字列、あるd.po_codeを、突き出ています。レシートはキーを参照すべきではなく、代わりにPost_Officeオブジェクトを参照してください。

変更

public virtual string po_code { get; set; } 

public virtual Post_Office po { get; set; } 

し、これが正常に動作する必要があります。

p = session.QueryOver<Reciept>(() => d) 
       .JoinAlias(() => d.po,() => dt) 
       .Where(() => dt.PO_CODE == "PD06003") 
       .List<Reciept>(); 

変数名の更新も反映されたマッピングを更新します。

+0

例外が修正されましたが、データが取得されません。 – Anshu

+0

上記をSQLで実行するとどうなりますか? –

+0

変数 "p"の値が返されません – Anshu

0

私が思いついた最終的な解決策は、Paul Connollyです。誰かの利益のために私はそれを投稿します。

Post_Office.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Postal" namespace="Postal.Models"> 
    <class name="Post_Office" table="POSTOFFICE.POST_OFFICE" lazy="true" > 

    <id name="PO_CODE" column="PO_CODE" type="Postal.MyChar, Postal" /> 

    <property name="PO_NAME" type=""> 
     <column name="PO_NAME" sql-type="VARCHAR2" not-null="true" /> 
    </property> 

    <property name="PO_TYPE"> 
     <column name="PO_TYPE" sql-type="VARCHAR2" not-null="false" /> 
    </property> 

    <property name="PO_ADD1"> 
     <column name="PO_ADD1" sql-type="VARCHAR2" not-null="false" /> 
    </property> 
    </class> 
</hibernate-mapping> 

Reciept.hbm。XML

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Postal" namespace="Postal.Models"> 
    <class name="Reciept" table="POSTOFFICE.RECEIPT_BOOK" lazy="true" > 

    <id name="Book_no" column="BOOK_NO" /> 

    <many-to-one name="po" class="Post_Office" column="PO_CODE" cascade="none" /> 


    <property name="Add_date"> 
     <column name="ADD_DATE" sql-type="DATE" not-null="false" /> 
    </property> 

    <property name="Add_user"> 
     <column name="ADD_USER" sql-type="VARCHAR2" not-null="false" /> 
    </property> 

    <property name="Add_ip_address"> 
     <column name="ADD_IP_ADDRESS" sql-type="VARCHAR2" not-null="false" /> 
    </property> 


    </class> 
</hibernate-mapping> 

Post_Officeクラス

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace Postal.Models 
{ 
    public class Post_Office 
    { 
     [Key] 
     [Required] 
     [Display(Name = "PO code : ")] 
     public virtual string PO_CODE { get; set; } 

     [Required] 
     [Display(Name = "PO Name : ")] 
     public virtual string PO_NAME { get; set; } 

     [Display(Name = "PO_TYPE : ")] 
     public virtual string PO_TYPE { get; set; } 

     [Display(Name = "PO_ADD1 : ")] 
     public virtual string PO_ADD1 { get; set; } 

    } 
} 

領収書のクラス

using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace Postal.Models 
{ 
    public class Reciept 
    { 
     [Key] 
     [Required] 
     [Display(Name = "Book No. : ")] 
     public virtual string Book_no { get; set; } 

     [Required] 
     [Display(Name = "PO code : ")] 
     //public virtual string po_code { get; set; } 

     public virtual Post_Office po { get; set; } 

     [Display(Name = "Add Date : ")] 
     public virtual DateTime? Add_date { get; set; } 

     [Display(Name = "Add User. : ")] 
     public virtual string Add_user { get; set; } 

     [Display(Name = "IP Address : ")] 
     public virtual string Add_ip_address { get; set; } 
    } 
} 

iを用いて接合した列が2つの長さ(CHAR(8)を有し、CHAR(として私は、カスタム・タイプが必要7)) MyCharクラス

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Web; 
using NHibernate; 
using NHibernate.SqlTypes; 
using NHibernate.UserTypes; 

namespace Postal 
{ 
    public class MyChar:IUserType 
    { 

     public bool IsMutable 
     { 
      get { return false; } 
     } 
     public Type ReturnedType 
     { 
      get { return typeof(string); } 
     } 

     public SqlType[] SqlTypes 
     { 
      get { return new SqlType[1] { new SqlType(DbType.AnsiStringFixedLength) }; } 
     } 

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

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

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

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

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

     public object NullSafeGet(IDataReader rs, string[] names, object owner) 
     { 
      string str = (string)NHibernateUtil.String.NullSafeGet(rs, names[0]); 
      return str != null ? (object)str.Trim() : (object)(string)null; 
     } 

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

     public object Replace(object original, object target, object owner) 
     { 
      return original; 
     } 
    } 
} 
私のDALクラスの

メソッド

public IList<Reciept> Get_Terrorist_Records2(string po_code) 
     { 
      IList<Reciept> p = null; 
      using (ISession session = OpenSession()) 
      { 
       Reciept d = null; 
       Post_Office dt = null; 

       try 
       { 
        p = session.QueryOver<Reciept>(() => d) 
        .JoinAlias(() => d.po,() => dt) 
        .Where(() => dt.PO_CODE == po_code) 
        .List<Reciept>(); 


       } 
       catch (Exception rd) 
       { } 

      } 
      return p; 
     } 
関連する問題