2016-11-23 45 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,當PO_CODE給出時。

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

有人可以引導我在正確的方向。在此先感謝

+0

保羅的解決方案對我來說很好,但是當你在它,你可能需要修正收據類的拼寫太(無關的問題)。 –

回答

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

在你JoinAlias,你投射d.po_code,這是一個字符串,以別名DT,它的類型是Post_Office的對象。收據不應引用該鍵,而應引用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; } 
    } 
} 

我需要自定義的類型,如列我用有兩種長度接合(炭(8)和字符( 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; 
     }