1

新しいプロジェクトを開始し、このプロジェクトではBasicSample(NHibernateのベストプラクティス、http://www.codeproject.com/Articles/13390/NHibernate-Best-Practices-with-ASP-NET-1-2nd-Ed )を使用したいと思いました。 )これまで使用したことがないので、問題が発生します。このプロジェクトでは、NHibernate 3.3.1を使用し、BasicSampleのソースコードを変更してエンティティを使用します。すべてのクラスモデルでこのエラーが発生します(クラス「Month」のみが表示されます)。

System.TypeInitializationException was unhandled by user code

メッセージ=「ネストされた」のタイプ初期化子が例外をスローしました。Source = Project.Data TypeName = Nested StackTrace:at Project.Data.NHibernateSessionManager.get_Instance()in Project.Data \ NHibernateSessionManager.cs:line 28 at Project.Web.NHibernateSessionModule.BeginTransaction(Object sender、EventArgs e)in App_Code \ NHibernateSessionModule .cs:line 27 at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()at System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)InnerException:NHibernate.InvalidProxyTypeExceptionMessage=次のタイププロキシとして使用することはできません:Project.Core.Domain.Calendar.Month:メソッドEqualsは「public /protectedvirtual」または「」である必要があります

クラスは次のようになります。

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の使用方法を誰かに説明してもらえますか?これはすべてのクラスで使用する方法がわからないためです=クラスのすべてのプロパティをここに追加する必要がありますか?

誰かが私を助けてくれることを願っています。

4

2 に答える 2

3

問題は例外スタックトレースに含まれています。あなたはそれらをもっと注意深く読む必要があります:

次のタイプはプロキシとして使用できません。Project.Core.Domain.Calendar.Month
:メソッドEqualsは「public / protectedvirtual」または「protectedinternalvirtual」
である必要がありますProject.Core.Domain.Calendar.Month:メソッドIsTransientは'public / protectedvirtual'または'protectedinternal virtual'
Project.Core.Domain.Calendar.Month:method get_Year should be'public / protected virtual' or'protected internal virtual'
Project.Core.Domain.Calendar.Month:method set_Year 「パブリック/保護された仮想」または「保護された内部仮想」である必要があります

public基本的に、クラスのすべてのprotectedメンバーを作成する必要がありますvirtual。そうしないと、遅延読み込みが機能しません。


GetHashCode
インスタンスのハッシュコードは、その存続期間中に変更されるべきではないため、変更可能なプロパティを含めないでください。

于 2012-08-17T14:05:50.643 に答える
2
  1. NHibernateはデフォルトで遅延読み込みを使用します。それはあなたのエンティティからプロキシクラスを作成することによってそれを実行します-あなたのエンティティから継承し、そのメンバーをオーバーライドします。これを機能させるには、すべてのエンティティメンバーをとしてマークする必要がありますvirtual。それは例外メッセージでそれが不平を言うものでした。

  2. についてGetHashCodeは、で実装し、オーバーライドDomainObjectでのみ使用する必要があります。また、をオーバーライドする必要があります。ここで理由を見つけることができます:NHibernate:EqualsとGetHashCodeをオーバーライドする理由IdGetHashCodeEquals

于 2012-08-17T14:07:47.180 に答える