我开始了一个新项目,对于这个项目,我想使用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,因为我不知道如何在每个类中使用这个=这个类中的每个属性都应该添加到这里吗?
我希望有人可以帮助我。
答案 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
的所有protected
和virtual
成员,否则延迟加载将无效。
GetHashCode
:
实例的哈希码不应该在其生命周期中发生变化,因此您不应该包含可以更改的属性。
答案 1 :(得分:2)
NHibernate默认使用延迟加载。它通过从您的实体创建代理类来执行它 - 从您的实体继承并覆盖它的成员。为此,您需要将所有实体成员标记为virtual
。这就是它在异常消息中抱怨的内容。
对于GetHashCode
,您应该在DomainObject
中实施,并且仅在Id
覆盖中使用GetHashCode
。您还应该覆盖Equals
。您可以在此处找到原因:NHibernate: Reasons for overriding Equals and GetHashCode。