流利的NHibernate:"集合与任何会话无关#34;

时间:2015-07-31 11:59:42

标签: c# asp.net .net nhibernate fluent-nhibernate

我收到此错误消息:

collection is not associated with any session

执行此代码时:

var post = Posts.Query().First(p => p.Id == id);

id通过控制器传递。

我的映射看起来像这样:

public PostMap()
{
    Id(x => x.Id);
    Map(x => x.Title);
    Map(x => x.UserId);
    Map(x => x.DateTime);
    Map(x => x.Content);
    Map(x => x.CategoryId, "category");
    Map(x => x.ReplyTo, "reply_to");
    References(x => x.User, "userid").ReadOnly().Not.LazyLoad();
    References(x => x.Category, "category").ReadOnly().Not.LazyLoad();
    HasMany(x => x.Replies).KeyColumn("reply_to").ReadOnly().Not.LazyLoad();
    Table("posts");
}
public CategoryMap()
{
    Id(x => x.Id);
    Map(x => x.Name);
    Map(x => x.ParentId, "parent");
    Map(x => x.SubCategory, "subcategory");
    HasMany(x => x.Posts).KeyColumn("category").ReadOnly().Not.LazyLoad();
    HasMany(x => x.Categories).KeyColumn("parent").ReadOnly().Not.LazyLoad();
    Table("categories");
}
public UserMap()
{
    Id(x => x.Id);
    Map(x => x.Username).Not.Nullable();
    Map(x => x.Password).Not.Nullable();
    Map(x => x.Email).Not.Nullable();         
    Map(x => x.Firstname);
    Map(x => x.Surname);
    Map(x => x.Salt);
    Map(x => x.Privilege);
    HasMany(x => x.Messages).KeyColumn("msg_to_userid").ReadOnly().Not.LazyLoad();
    HasMany(x => x.SentMessages).KeyColumn("msg_from_userid").ReadOnly().Not.LazyLoad();
    Table("users");
}

Query()是一个返回IQueryable()

的方法

有谁知道这个问题可能是什么?

修改 这真的很奇怪。如果用户已登录,则根本不起作用。 但是如果用户未登录,则会每隔一段时间运行一次。如果我得到异常,继续并再次刷新它可行,然后如果我再次刷新它不起作用。我非常确定它与会话和映射有关。

我的会话在BaseController

中设置如下
protected HttpSessionState SessionState
{
    get { return System.Web.HttpContext.Current.Session; }
}
    protected User User
    {
        get
        {
            if (_user != null)
                return _user;
            if (SessionState["User"] == null)
                return null;
            return (_user = Users.Get((int)SessionState["User"]));
        }
    }

1 个答案:

答案 0 :(得分:-1)

protected User User
    {
        get
        {
            if (_user != null)
                return _user;

问题在于上面的语句,您将用户存储在控制器中的变量中,该变量可能存在于会话的生命周期之外。您不应该将实体存储在这些变量中,而是存储主键并在需要时获取实体/或存储DTO。