C# ADOTransation-isolationlevel为空asp.net mvc 5 fluent nhibernate

C# ADOTransation-isolationlevel为空asp.net mvc 5 fluent nhibernate,c#,asp.net,asp.net-mvc,nhibernate,fluent-nhibernate,C#,Asp.net,Asp.net Mvc,Nhibernate,Fluent Nhibernate,我在使用fluent nhibernate将多个项目保存到c#asp.net中的数据库时遇到问题。我有: public static readonly ISessionFactory SessionFactory = DbContext.SessionFactory(); public static readonly ISession Session = SessionFactory.OpenSession(); public static readonly ITransa

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

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

    }
public静态只读ISessionFactory SessionFactory=DbContext.SessionFactory();
public static readonly ISession Session=SessionFactory.OpenSession();
public static readonly ITransaction Transaction=Session.BeginTransaction();
public IEnumerable候选者=>Session.Query();
公共候选GetUser(int-id)
{
返回Session.Query().FirstOrDefault(x=>x.Id==Id);
}
公众候选人(候选人)
{
尝试
{
Session.Save(候选者);
Commit();
}
捕获(异常)
{
投掷;
}
}
错误是:IsolationLevel='((NHibernate.Transaction.adotransation)Transaction)。IsolationLevel'引发了类型为“System.NullReferenceException”的异常

详细信息:无法访问已删除的对象

我的班级背景:

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

}
公共静态类DbContext
{
私人静态ISessionFactory_sessionFactory;
静态DbContext()
{
GetFactory();
}
公共静态void GetFactory()
{
var myEntities=new[]
{
类型(应用程序用户)
};
var configuration=fluntly.Configure()
.Database(MsSqlConfiguration.MsSql2012.ConnectionString(c=>c.fromConnectionString WithKey(“ConnectionString”))
.ShowSql())
.Mappings(m=>m.FluentMappings.AddFromAssembly(Assembly.getExecutionGassembly()))
.ExposeConfiguration(x=>
{
x、 SetProperty(“,”);
x、 AddDeserializedMapping(MappingHelper.GetIdentityMappings(myEntities)),null;
})
.ExposeConfiguration(BuildSchema);
_sessionFactory=configuration.BuildSessionFactory();
}
公共静态ISessionFactory会话工厂()
{
返回工厂;
}
公共静态会话GetSession()
{
如果(!CurrentSessionContext.HasBind(_sessionFactory))
CurrentSessionContext.Bind(_sessionFactory.OpenSession());
返回_sessionFactory.GetCurrentSession();
}
公共静态ISession MakeSession()
{
返回_sessionFactory.OpenSession();
}
//publicstaticiuserstoreusers=>newidentitystore(MakeSession());
私有静态void BuildSchema(配置)
{
新模式更新(配置)
.执行(真的,真的);
}
}
求求你,救命!
谢谢

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

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;
            }
        }
    }
}
public静态只读ISessionFactory SessionFactory=DbContext.SessionFactory();
公共候选GetUser(int-id)
{
候选者=null;
使用(var session=SessionFactory.OpenSession())
{
candidate=Session.Query().FirstOrDefault(x=>x.Id==Id);
}
返回候选人;
}
公众候选人(候选人)
{
使用(var session=SessionFactory.OpenSession())
{
使用(var transaction=session.BeginTransaction())
{
尝试
{
Session.Save(候选者);
Commit();
}
抓住
{
transaction.RollBack();
投掷;
}
}
}
}
避免公开
Queryable
,因为您的代码正在
Candidates
属性上执行此操作

有一些方法可以正确地在应用程序上实现会话管理,并且根据执行的环境代码的不同,会话管理可能会发生变化

我建议您查看以下帖子:


IMHO,将会话和事务作为静态字段不是一个好的设计。尝试将OpenSession()和BeginTransaction()调用添加到AddCandidate()方法中。我正在测试您的代码,目前工作正常,非常感谢!