AdoTransaction - isolationlevel 为 null asp.net mvc 5 fluent nhibernate

AdoTransaction - isolationlevel is null asp.net mvc 5 fluent nhibernate

我在 c# asp.net 中使用流畅的 nhibernate 将多个项目保存到数据库时遇到问题。我有:

   public static readonly ISessionFactory SessionFactory = DbContext.SessionFactory();
    public static readonly ISession Session = SessionFactory.OpenSession();
    public static readonly ITransaction Transaction = Session.BeginTransaction();

    public IEnumerable<Candidate> Candidates => Session.Query<Candidate>();

    public Candidate GetUser(int id)
    {
        return Session.Query<Candidate>().FirstOrDefault(x => x.Id == id);
    }

    public void AddCandidate(Candidate candidate)
    {
        try
        {
            Session.Save(candidate);
            Transaction.Commit();
        }
        catch (Exception exception)
        {
            throw;
        }

    }

错误是:IsolationLevel = '((NHibernate.Transaction.AdoTransaction)Transaction).IsolationLevel' 引发了 'System.NullReferenceException'

类型的异常

更多信息:无法访问已删除的对象

我的 Class DbContext:

 public static class DbContext
{
    private static ISessionFactory _sessionFactory;

    static DbContext()
    {
        GetFactory();
    }
    public static void GetFactory()
    {
        var myEntities = new[]
        {
            typeof (ApplicationUser)
        };
        var configuration = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2012.ConnectionString(c => c.FromConnectionStringWithKey("ConnectionString"))
                    .ShowSql())
                .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
                .ExposeConfiguration(x =>
                {
                    x.SetProperty("", "");
                    x.AddDeserializedMapping(MappingHelper.GetIdentityMappings(myEntities), null);
                })
                .ExposeConfiguration(BuildSchema);

        _sessionFactory = configuration.BuildSessionFactory();

    }
    public static ISessionFactory SessionFactory()
    {
        return _sessionFactory;
    }

    public static ISession GetSession()
    {
        if (!CurrentSessionContext.HasBind(_sessionFactory))
            CurrentSessionContext.Bind(_sessionFactory.OpenSession());

        return _sessionFactory.GetCurrentSession();
    }
    public static ISession MakeSession()
    {
        return _sessionFactory.OpenSession();
    }
    //public static IUserStore<ApplicationUser, string> Users => new IdentityStore(MakeSession());

    private static void BuildSchema(Configuration config)
    {
        new SchemaUpdate(config)
            .Execute(true, true);
    }

}

请帮忙! 谢谢!

SessionFactory 应该是单例,将其用作静态可以成为解决方案的一部分。 ISessionITransaction 中的对象应在必要时创建。尝试将您的代码更改为如下内容:

public static readonly ISessionFactory SessionFactory = DbContext.SessionFactory();

public Candidate GetUser(int id)
{
    Candidate candidate = null;
    using (var session = SessionFactory.OpenSession())
    {
        candidate = Session.Query<Candidate>().FirstOrDefault(x => x.Id == id);
    }
    return candidate;        
}

public void AddCandidate(Candidate candidate)
{
    using (var session = SessionFactory.OpenSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            try
            {
                Session.Save(candidate);
                transaction.Commit();
            }
            catch 
            {
                transaction.RollBack();
                throw;
            }
        }
    }
}

避免像您的代码在 Candidates 属性.

上那样公开 Queryable

有一些方法可以在应用程序上正确实施会话管理,并且根据执行的环境代码,它可以更改。

我推荐你看看这些帖子: http://benfoster.io/blog/yet-another-session-per-request-post

How to implement session-per-request pattern in asp.net mvc with Nhibernate