2012-08-17 79 views
1

我開始了一個新項目,併爲這個項目我想使用BasicSample(NHibernate最佳實踐,http://www.codeproject.com/Articles/13390/NHibernate-Best-Practices-with-ASP-NET-1-2nd-Ed)我以前沒有使用過,現在我得到的問題。在這個項目中,我使用NHibernate 3.3.1並修改了BasicSample中的源代碼以使用我的entrators。我得到這個錯誤,每類模型(只顯示爲類「月」):NHibernate BasicSample與Nhibernate 3.3

System.TypeInitializationException was unhandled by user code 

消息=爲「套」的類型初始值引發異常。 源= Project.Data 類型名=嵌套 堆棧跟蹤: 在Project.Data.NHibernateSessionManager.get_Instance()在Project.Data \ NHibernateSessionManager.cs:線28 在Project.Web.NHibernateSessionModule.BeginTransaction(對象發件人,EventArgs的)在App_Code文件\ NHibernateSessionModule.cs:線27 在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步驟,布爾& completedSynchronously) 的InnerException :NHibernate.InvalidProxyTypeException Message =以下類型不能用作代理: Project.Core.Domain.Calendar.Month:m方法Equals應該是'public/protected virtual'或'protected internal virtual' Project.Core.Domain.Calendar.Month:方法IsTransient應該是'public/protected virtual'或'protected internal virtual' Project.Core.Domain。 Calendar.Month:方法get_Year應該是'public/protected virtual'或'protected internal virtual' Project.Core.Domain.Calendar.Month:方法set_Year應該是'public/protected virtual'或'protected internal virtual' Blockquote

類的樣子:

public class Month : DomainObject<int> 
{ 
    private Year _year; 
    public Year Year 
    { 
     get { return _year; } 
     set { _year = value; } 
    } 

    private string _monthName; 
    public string MonthName 
    { 
     get { return _monthName; } 
     set { _monthName = value; } 
    } 

    private IList<Consumption> consumptions = new List<Consumption>(); 
    public IList<Consumption> Consumptions 
    { 
     get { return new List<Consumption>(consumptions).AsReadOnly(); } 
     protected set { consumptions = value; } 
    } 

    public Month() 
    { } 

    public override int GetHashCode() 
    { 
     return (GetType().FullName + "|" + 
       MonthName.GetHashCode()).GetHashCode(); 
    } 

anoyone知道問題可能是什麼?我一直在交叉檢查我的項目和BasicSample項目,但我找不到任何錯過的東西。

2.有人能爲我解釋如何使用DaomainObject中的GetHashCode,因爲我不知道如何在每個類中使用這個類=應該將類中的每個屬性添加到此處嗎?

我希望有人能幫助我。

回答

2
  1. NHibernate默認使用延遲加載。它通過從您的實體創建代理類來執行它 - 從您的實體繼承並覆蓋它的成員。爲了使其發揮作用,您需要將所有實體成員標記爲virtual。這是它在異常信息中所抱怨的。

  2. 至於GetHashCode,您應該在DomainObject中實現它,並且只在GetHashCode覆蓋中使用Id。您還應該覆蓋Equals。在這裏你可以找到原因:NHibernate: Reasons for overriding Equals and GetHashCode

+0

我讓所有成員公開虛擬。然後,我嘗試作爲示例項目..他們沒有虛擬。我已經改回虛擬,但我仍然得到相同的錯誤 – Thommie 2012-08-17 14:14:48

+0

你的DomainObject應該有Id作爲虛擬成員。那就是問題所在。還有DomainObject的其他成員。 – 2012-08-17 14:19:35

+1

另外,在那裏,它應該足以讓GetHashCode/Equals覆蓋在DomainObject中。 – 2012-08-17 14:20:25

3

該問題包含在您的異常堆棧跟蹤中。你需要細細閱讀:

以下類型可能不被用作代理:
Project.Core.Domain.Calendar.Month:方法Equals應該是「公共/受保護的虛擬」或「受保護的內部虛擬'
Project.Core.Domain.Calendar.Month:方法IsTransient應該是'public/protected virtual'或'protected internal virtual'
Project.Core.Domain.Calendar.Month:方法get_Year應該是'public/protected虛擬'或'受保護的內部虛擬'
Project.Core.Domain.Calendar.Month:方法set_Year應該是'public/protected virtual'或'protected internal virtual'

它說什麼,基本上,你需要讓你的virtual類的所有publicprotected成員,否則延遲加載將無法正常工作。


GetHashCode
實例的哈希代碼不應該在其生命週期的過程中發生變化,因此,你不應該包括可以更改的屬性。

+0

我把所有的成員都公開爲虛擬的。然後,我嘗試作爲示例項目..他們沒有虛擬。我已經改回虛擬,但我仍然得到相同的錯誤。 – Thommie 2012-08-17 14:12:50

+1

@Thommie:我相信你沒有得到相同的**錯誤。您可能會發布新的調用堆棧。或者嘗試自己仔細閱讀,並檢查是否可以自己弄清楚。我假設'DomainObject.IsTransient'仍然不是'虛擬'。 – 2012-08-17 14:14:25

+0

我向你證明了同樣的錯誤。以下類型不能用作代理:('所有成員都是公共虛擬的) Project.Core.Domain.Calendar.Month:方法等於應該是'public/protected virtual'或'protected internal virtual' Project.Core .Domain.Calendar.Month:方法IsTransient應該是'public/protected virtual'或'protected internal virtual' Project.Core.Domain.Calendar.Month:method get_Id應該是'public/protected virtual'或'protected internal virtual' Project.Core.Domain.Calendar.Month:方法set_Id應該是'public/protected virtual'或'protected internal virtual' – Thommie 2012-08-17 14:18:19