延迟加载:没有会话或者会话被关闭

本文关键字:会话 或者 延迟加载 | 更新日期: 2023-09-27 17:50:23

我对以下NHibernate行为感到困惑:
域类和映射:

public class Category
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
    private IList<Product> _products;
    public virtual IList<Product> Products
    {
        get { return new List<Product>(_products).AsReadOnly(); }
    }
    public Category()
    {
        _products = new List<Product>();
    }
}
public class Product
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
    public virtual Category Category { get;set; }
}
public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Schema("dbo");
        Table("tProducts");
        Id(x => x.ID);
        Map(x => x.Name);
        References(x => x.Category).Column("CategoryID");
    }
}
public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Schema("dbo");
        Table("tCategories");
        Id(x => x.ID);
        Map(x => x.Name);
        HasMany(x => x.Products)
            .KeyColumn("CategoryID")
            .Access.CamelCaseField(Prefix.Underscore)
            .Inverse()
            .Cascade.All();
    }
}

出现问题的代码:

    Category category;
    using (var session = sessionFactory.OpenSession())
    {
        category = session.Get<Category>(1);
    }
    using (var session = sessionFactory.OpenSession())
    {
        var products = category.Products; // exception
    }

为什么当我尝试获取产品时没有会话异常?我这里有个会议!如何避免这种异常(我喜欢2个会话在这里,我想保持加载懒惰)?
提前感谢!

延迟加载:没有会话或者会话被关闭

是否可以将对象重新连接到新会话:

ISession.Update(myDetachedInstance);  

或者,如果对象没有改变:

ISession.Lock(myDetachedInstance, NHibernate.LockMode.None);  

更多信息请参见:http://intellect.dk/post/Detached-objects-in-nHibernate-and-Lazy-loading.aspx

我得到了同样的错误,这是由于WPF UI坚持引用对象从旧的nhibernate会话后,我点击了"刷新"按钮,调用数据上下文的刷新,在会话中解除关联的所有缓存对象。

我需要确保"NotifyChange"被触发以使UI更新(并且UI正在监听它)。