1

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

System.TypeInitializationException was unhandled by user code

Message=“嵌套”的类型初始化程序引发了异常。Source=Project.Data TypeName=Nested StackTrace:在 Project.Data\NHibernateSessionManager.cs 中的 Project.Data.NHibernateSessionManager.get_Instance():在 App_Code\NHibernateSessionModule 中的 Project.Web.NHibernateSessionModule.BeginTransaction(Object sender, EventArgs e) 的第 28 行.cs:line 27 at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) InnerException: NHibernate.InvalidProxyTypeException Message=以下类型不得用作代理:Project.Core.Domain.Calendar.Month:方法 Equals 应为“公共/受保护的虚拟”或“

类看起来像:

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

有没有人知道问题可能是什么?我一直在交叉检查我的项目和 BasicSample 项目,但我找不到任何不匹配的东西。

2.有人可以为我解释如何使用 DaomainObject 中的 GetHashCode,因为我不知道如何在每个类中使用这个= 是否应该在此处添加类中的每个属性?

我希望有一个人可以帮助我。

4

2 回答 2

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 virtual' 或 'protected internal virtual'
Project.Core.Domain.Calendar.Month:方法 set_Year应该是“公共/受保护的虚拟”或“受保护的内部虚拟”

它所说的基本上是,你需要让所有publicprotected你的类成员virtual,否则延迟加载将不起作用。


GetHashCode
实例的哈希码在其生命周期内不应更改,因此不应包含可以更改的属性。

于 2012-08-17T14:05:50.643 回答
2
  1. NHibernate 默认使用延迟加载。它通过从您的实体创建代理类来执行它 - 从您的实体继承并覆盖它的成员。为了使它起作用,您需要将所有实体成员标记为virtual。这就是它在异常消息中抱怨的内容。

  2. 至于GetHashCode,您应该在覆盖中实现它DomainObject并且仅IdGetHashCode覆盖中使用。您还应该覆盖Equals. 在这里您可以找到原因:NHibernate:覆盖 Equals 和 GetHashCode 的原因

于 2012-08-17T14:07:47.180 回答