【问题标题】:Database Session attribute does not create a one as expected数据库会话属性未按预期创建一个
【发布时间】:2015-10-14 05:53:24
【问题描述】:

我使用 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>();

【问题讨论】:

    标签: c# nhibernate dependency-injection asp.net-web-api2 asp.net-core


    【解决方案1】:

    session默认是不开启的,你是不是通过nuget添加并配置例如:

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

    see also

    【讨论】:

    • 和 services.AddSession();
    • 我不确定这个会话是否与我的相同,但我会试一试。编辑:仍然是同样的错误
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2016-09-13
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多