数据库会话属性没有按预期创建一个

本文关键字:创建 一个 属性 会话 数据库 | 更新日期: 2023-09-27 18:04:14

我用asp.net 5创建了一个web api项目,并试图设置我的NHibernate会话管理。一切似乎都很好,但在我的控制器内,当我尝试使用会话时,我得到一个空异常,虽然我用NHibernateSession属性标记它。

我意识到该方法不使用由属性创建的会话。我该怎么做才能让它使用那个?如有任何建议,不胜感激。

public class ValuesController : Controller
{
    private readonly IRepository _repository;
    public ISessionContainer NHibernateSession { get; set; }
    public ValuesController(IRepository repository)
    {
        _repository = repository;
    }
    // GET: api/values
    [HttpGet, NHibernateSession]
    public IEnumerable<string> Get()
    {
        return _repository.GetProducts(); // session is null exception
    }
}

public class NHibernateSessionAttribute: ActionFilterAttribute
{
    protected ISessionContainer sessionContainer;
    public NHibernateSessionAttribute()
    {
        sessionContainer = new NHibernateSessionContainer();
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        sessionContainer.OpenSession();
    }
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        sessionContainer.CloseSession();
    }
}

public class NHibernateSessionContainer : ISessionContainer
{
    public static ISessionFactory SessionFactory = CreateSessionFactory();
    private ISession _session;
    private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(OracleClientConfiguration.Oracle10
            .ConnectionString(ConfigurationManager.ConnectionStrings["Main.ConnectionString"].ConnectionString))
            .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
            .BuildConfiguration().BuildSessionFactory();
    }
    public ISession Session
    {
        get { return _session; }
    }
    public void OpenSession()
    {
        _session = SessionFactory.OpenSession();
    }
    public void CloseSession()
    {
        Dispose();
    }
    public void Dispose()
    {
        _session.Dispose();
    }
}

services.AddSingleton<ISessionContainer, NHibernateSessionContainer>();
services.AddTransient<IRepository, Repository>();

数据库会话属性没有按预期创建一个

会话是默认不启用的,您是否通过nuget添加它并配置它,例如:

app.UseSession();
app.UseInMemorySession(configure: s => s.IdleTimeout = TimeSpan.FromMinutes(20));

参见

相关文章: