我有一个带有fluentnhibernate的asp.net(网站)项目的.NET 3.5解决方案和它的测试项目(类库项目)。我已经在测试项目中引用了asp.net项目并且使用了所有fluentnhibernate / nhibenate dlls。
我无法理解的是,在一个webform(从浏览器命中)的运行中,让我们说Test.aspx,架构的构建是成功的,我可以看到我的数据库中的表。 这是我在Test.aspx.cs上调用的方法
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ISession session = SessionManager.Instance.OpenSession();
SessionManager.BuildSchema(session);
}
}
我碰巧在我的测试类的CanGenerateSchema方法中使用相同的方法,它总是失败
[TestFixture]
public class CanGenerateSchemaTestSuite
{
[Test]
public void CanGenarateSchema()
{
ISession session = SessionManager.Instance.OpenSession();
SessionManager.BuildSchema(session);
}
}
这是我使用的SessionManager:
public sealed class SessionManager
{
private readonly ISessionFactory _sessionFactory;
public static ISessionFactory SessionFactory
{
get { return Instance._sessionFactory; }
}
private ISessionFactory GetSessionFactory()
{
return _sessionFactory;
}
public static SessionManager Instance
{
get { return NestedSessionManager._sessionManager; }
}
public ISession OpenSession()
{
return Instance.GetSessionFactory().OpenSession();
}
private static Configuration SaveConfigs;
private SessionManager()
{
try
{
if (_sessionFactory == null)
{
//from the debugging the code breaks from here when trying to get connectionstring.
string constring = ConfigurationManager.AppSettings["localdb"].ToString();
FluentConfiguration configuration = Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2005.ConnectionString(constring))
.Mappings(m =>
{
m.FluentMappings.AddFromAssemblyOf<myproject.model.Request>();
m.FluentMappings.AddFromAssemblyOf<myproject.model.Route>();
})
.ExposeConfiguration((x) =>
{
SaveConfigs = x;
x.SetProperty("current_session_context_class", "thread_static");
});
_sessionFactory = configuration.BuildSessionFactory();
}
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
public static void BuildSchema(ISession session)
{
var export = new SchemaExport(SaveConfigs);
export.Execute(false,true,false,session.Connection,null);
}
class NestedSessionManager
{
internal static readonly SessionManager _sessionManager = new SessionManager();
}
}
因此,从我的评论中,访问连接字符串时会发生NullReferenceException。我没有解释为什么会发生这种情况。我确定这是某种陷阱,我无法克服它。如果有人能帮我一把,我将非常感激。谢谢你的阅读。
答案 0 :(得分:1)
ConfigurationManager.AppSettings["localdb"]
将从您的web.config
文件中提取出来。
您的测试项目无法访问该文件(我假设您的测试与您的网站位于一个单独的项目中)。您应该能够通过使用正确的localdb设置将app.config
文件添加到测试项目中来解决此问题,或者使用FluentNHibernate的流畅构建器,而不是使用配置字符串。
示例app.config文件:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="localdb" value="yourconnectionstring" />
</appSettings>
</configuration>
答案 1 :(得分:0)
如果ConfigurationManager.AppSettings["localdb"]
返回的值为null
,则.ToString()
调用将导致NullReferenceException
。
确保“localdb”设置存在。