MVC3剃须刀与nHibernate
作为一个著名的ORM,我们决定使用asp.NETMVC3使用nHIbernate。我们通过以下方式建立了我们的项目:MVC3剃须刀与nHibernate,nhibernate,asp.net-mvc-3,razor,nunit,Nhibernate,Asp.net Mvc 3,Razor,Nunit,作为一个著名的ORM,我们决定使用asp.NETMVC3使用nHIbernate。我们通过以下方式建立了我们的项目: NHibernate存储库[包含NHibernate的映射、服务和存储库] MVC3[这是一个用户界面] 测试MVC NHibernate[这是NUnit的测试项目] 在上面,[]文本被写出来,以明确各层 一切正常,意味着映射、插入、更新和删除操作的所有单元测试都已通过。 不幸的是,当我们从mvc3应用程序执行相同的操作时,它抛出了以下错误: "An exception occu
以上在测试项目中运行良好:
using (var nhr = new NHibernateRepository())
{
var DeptList = nhr.GetAll<Departments>();
}
使用(var nhr=new nhibernaterepositionory())
{
var DeptList=nhr.GetAll();
}
以下是NHibernateRepository项目中的hibernate.cfg.xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Data Source=(local);Initial Catalog=myDatabaseName;Integrated Security=True</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="cache.use_query_cache">false</property>
<property name="adonet.batch_size">100</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
</session-factory>
</hibernate-configuration>
NHibernate.Driver.SqlClientDriver
数据源=(本地);初始目录=myDatabaseName;集成安全性=真
真的
NHibernate.dialogue.mssql2008dialogue
假的
100
NHibernate.ByteCode.Castle.proxyFactory,NHibernate.ByteCode.Castle
除此之外,该项目还拥有NHibernate所需的所有DLL
在测试项目中,并没有特殊的配置设置,只是我们添加了存储库项目和其他程序集的引用
MVC3应用程序项目中也保持了同样的功能
这方面的任何帮助都是非常值得赞赏的
关于我不确定这是否能解决您当前的问题,但我有一些建议。首先,在您的
Global.asax
或(我的首选)通过HttpModule实现每请求会话管理。下面是一个简单的例子:
public class NHHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.EndRequest += ApplicationEndRequest;
context.BeginRequest += ApplicationBeginRequest;
}
public void ApplicationBeginRequest(object sender, EventArgs e)
{
CurrentSessionContext.Bind(SessionFactory.GetNewSession());
}
public void ApplicationEndRequest(object sender, EventArgs e)
{
var currentSession = CurrentSessionContext.Unbind(SessionFactory.GetSessionFactory());
currentSession.Close();
currentSession.Dispose();
}
public void Dispose()
{
// Do nothing
}
}
请注意,这也会在请求管理期间绑定当前会话上下文
此外,请确保设置了正确的会话上下文。测试可能应该使用线程
上下文,但是web应用程序应该使用web
上下文。我个人通过Fluent NHibernate对此进行了配置,但我相信在XML配置文件中,它会显示为:
<property name="current_session_context_class">web</property>
web
同样,我通常使用FNH进行配置,因此请验证。Per@Michael-我通过提供以下答案来关闭此线程,我在研究过程中发现了这一点 我们需要做两件事来妥善解决问题
感谢所有回答上述问题的人。@Bertrand-非常感谢将其格式化。我真的很想这么做,但没能做到。nunit和web应用程序读取配置文件的方式往往不同。请提供有关如何设置您的NHibernate配置的更多信息(它在哪个文件中,有哪些值等)。@Michael-更新了原始问题的更多细节。谢谢大家!我解决了这个问题。在我这方面有一个愚蠢的错误:(使hbm文件成为嵌入文件,并且工作正常:)如上所述,我发现并通知了解决方案,我将此问题标记为已结束。啊!!我试图将其标记为已关闭,但在关闭窗口中未找到任何有效选项。我请求主持人请关闭此问题谢谢您的回复,但在创建sessionfactory之前,我们将收到一个完整的问题和代码片段。哪一行是存储库代码中的第33行(以便我们可以确切知道错误抛出的位置)?第33行包含:config.Configure();我怀疑这与配置文件的位置有关。如果你的web应用程序中没有配置文件,它可能无法工作。如果您的存储库项目是一个类库,则需要将该配置放在web项目中。或者,您可以将其放在web.config中,如下所述:谢谢Josh-相同的配置和相同的结构适用于asp.net项目,但只适用于mvc3项目。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Data Source=(local);Initial Catalog=myDatabaseName;Integrated Security=True</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="cache.use_query_cache">false</property>
<property name="adonet.batch_size">100</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
</session-factory>
</hibernate-configuration>
public class NHHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.EndRequest += ApplicationEndRequest;
context.BeginRequest += ApplicationBeginRequest;
}
public void ApplicationBeginRequest(object sender, EventArgs e)
{
CurrentSessionContext.Bind(SessionFactory.GetNewSession());
}
public void ApplicationEndRequest(object sender, EventArgs e)
{
var currentSession = CurrentSessionContext.Unbind(SessionFactory.GetSessionFactory());
currentSession.Close();
currentSession.Dispose();
}
public void Dispose()
{
// Do nothing
}
}
<property name="current_session_context_class">web</property>