asp.net nhibernate 解决方案的集成测试项目中的 NullReferenceExpection

发布于 2024-10-03 13:51:49 字数 3028 浏览 2 评论 0原文

我有一个 .NET 3.5 解决方案,其中包含一个带有 Fluentnhibernate 的 asp.net(网站)项目及其测试项目(类库项目)。我在测试项目中引用了 asp.net 项目以及所有 Fluentnhibernate/nhibenate dll。

我无法理解的是,在运行网络表单(从浏览器点击)时,比如说 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。我没有解释为什么会发生这种情况。我确信这是某种陷阱,我无法克服它。如果有人能在这里帮助我,我将非常感激。感谢您的阅读。

i have a .NET 3.5 solution with an asp.net(web site) project with fluentnhibernate and it's test project(class library project).i've referenced the asp.net project in the test project and with all fluentnhibernate/nhibenate dlls.

What i fail to comprehend is that, on a run of a webform (hit from browser) let's say Test.aspx, building of schema is successfull and i could see the tables in my database.
here is the method i call on 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);
    }
}

i happen to use the same method in CanGenerateSchema method of my test class and it always fails

 [TestFixture]
public class CanGenerateSchemaTestSuite
{
    [Test]
    public void CanGenarateSchema()
    {
        ISession session = SessionManager.Instance.OpenSession();
        SessionManager.BuildSchema(session);
    }
}

here is the SessionManager i use :

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

So from my comment the NullReferenceException happens when accessing the connectionstring. I don't have the explanation on why that happens.I'm sure it's some kind of gotchas, i can't get over it.I would be very grateful if anyone could give me a hand here.thanks for reading.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你怎么这么可爱啊 2024-10-10 13:51:49

Test.aspx 中的 ConfigurationManager.AppSettings["localdb"] 将从 Web 项目上的 web.config 文件中提取。

您的测试项目无法访问该文件(我假设您的测试位于与您的网站不同的项目中)。您应该能够通过使用正确的 localdb 设置将 app.config 文件添加到您的测试项目中来解决此问题,或者不使用配置字符串,而使用 FluentNHibernate 的 Fluent 构建器。

示例 app.config 文件:

<?xml version="1.0"?>
<configuration>
 <appSettings>
   <add key="localdb" value="yourconnectionstring" />
 </appSettings>
</configuration>

ConfigurationManager.AppSettings["localdb"] from Test.aspx would be pulling from your web.config file on a web project.

That file wouldn't be accessible to your test project (I'm assuming your tests are in a separate project from your web site). You should be able to get around this by adding an app.config file into your test project with the correct localdb settings or rather than using a configuration string, use FluentNHibernate's fluent builder.

Example app.config file:

<?xml version="1.0"?>
<configuration>
 <appSettings>
   <add key="localdb" value="yourconnectionstring" />
 </appSettings>
</configuration>
So要识趣 2024-10-10 13:51:49

如果 ConfigurationManager.AppSettings["localdb"] 返回的值为 null,则 .ToString() 调用将导致 NullReferenceException

确保“localdb”设置存在。

If the value returned by ConfigurationManager.AppSettings["localdb"] is null then the .ToString() call will cause the NullReferenceException.

Ensure the "localdb" setting exists.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文