NHibernate BasicSample与Nhibernate 3.3

时间:2012-08-17 14:02:22

标签: c# asp.net nhibernate c#-4.0

我开始了一个新项目,对于这个项目,我想使用BasicSample(NHibernate最佳实践,http://www.codeproject.com/Articles/13390/NHibernate-Best-Practices-with-ASP-NET-1-2nd-Ed)我以前没用过这个,现在我遇到了问题。在这个项目中,我使用NHibernate 3.3.1并修改了BasicSample的源代码以使用我的entieties。我为每个类模型都得到了这个错误(仅显示类“Month”):

System.TypeInitializationException was unhandled by user code
  

Message ='Nested'的类型初始值设定项引发异常。     来源= Project.Data     类型名=嵌套     堆栈跟踪:          在Project.Data \ NHibernateSessionManager.cs中的Project.Data.NHibernateSessionManager.get_Instance():第28行          在App_Code \ NHibernateSessionModule.cs中的Project.Web.NHibernateSessionModule.BeginTransaction(Object sender,EventArgs e):第27行          在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()          在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)     InnerException:NHibernate.InvalidProxyTypeException          消息=以下类型不能用作代理:   Project.Core.Domain.Calendar.Month:方法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'   块引用

该课程如下:

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 个答案:

答案 0 :(得分:3)

问题包含在异常堆栈跟踪中。你需要更仔细地阅读它们:

  

以下类型不得用作代理:
  Project.Core.Domain.Calendar.Month:方法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'

它所说的基本上是,您需要制作班级public的所有protectedvirtual成员,否则延迟加载将无效。


GetHashCode
实例的哈希码不应该在其生命周期中发生变化,因此您不应该包含可以更改的属性。

答案 1 :(得分:2)

  1. NHibernate默认使用延迟加载。它通过从您的实体创建代理类来执行它 - 从您的实体继承并覆盖它的成员。为此,您需要将所有实体成员标记为virtual。这就是它在异常消息中抱怨的内容。

  2. 对于GetHashCode,您应该在DomainObject中实施,并且仅在Id覆盖中使用GetHashCode。您还应该覆盖Equals。您可以在此处找到原因:NHibernate: Reasons for overriding Equals and GetHashCode