尝试获取ISession时,流畅的nhibernate会抛出TypeInitializationException

时间:2012-07-16 21:31:01

标签: nhibernate fluent-nhibernate

我有这个使用NHibernate的代码

    public bool ValidateUser(string username, string password)
    {
        bool loginResult;
        using (var session = SessionFactory.Session)
        {
            session.BeginTransaction();

            var makeQuery = session.Query<User>().SingleOrDefault(x => x.Username == username && x.Password == password);

            loginResult = makeQuery != null;
        }

        return loginResult;
    }

我的SessionFactory看起来像这样

using NHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using WebSite.DatabaseModels;
using System;
namespace GameServer.Repository
{
public class SessionFactory
{
    private static string connString = System.Configuration.ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ConnectionString;

    private static ISessionFactory session;
    private static object syncRoot = new Object();

    private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MySQLConfiguration
            .Standard
            .ConnectionString(connString))
            .Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<UserMap>())
                .ExposeConfiguration(UpdateSchema)
                .BuildSessionFactory();
    }

    private static void UpdateSchema(Configuration cfg)
    {
        new SchemaUpdate(cfg);
    }

    public static ISession Session
    {
        get
        {
            if (session == null)
            {
                lock (syncRoot)
                {
                    if (session == null)
                        session = CreateSessionFactory();
                }
            }
            return session.OpenSession();
        }
    }

^ 我尝试在Session属性上设置一个断点,但是没有点击,但是在使用(var session = SessionFactory.Session)时抛出了异常,并且无法真正看到我如何在错误报告中修复它 enter image description here

1 个答案:

答案 0 :(得分:1)

如果粘贴实际的异常字符串(堆栈跟踪的整个异常)而不是图像,那会更好。

正如您在堆栈跟踪中看到的那样,异常发生在cctor类的SessionFactory中。 cctor是一个静态构造函数。由于您没有显式的,因此您的代码可能会在初始化SessionFactory类的静态字段时中断。

我最好的选择是你的配置文件中没有名为MySQLConnectionString的连接字符串。在那种情况下:

// this is null
ConfigurationManager.ConnectionStrings["MySQLConnectionString"];

// this will throw NullReferenceException
ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ConnectionString;