NHibernate - 延迟加载:没有关闭会话或会话

时间:2011-04-18 12:35:38

标签: c# nhibernate lazy-loading

我对以下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个会话,我想继续加载懒惰)?
提前谢谢!

2 个答案:

答案 0 :(得分:4)

您可以将对象重新附加到新会话:

ISession.Update(myDetachedInstance);  

或者,如果对象尚未更改:

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

有关详细信息,请参阅:http://intellect.dk/post/Detached-objects-in-nHibernate-and-Lazy-loading.aspx

答案 1 :(得分:1)

我得到了同样的错误,这是因为我点击了“刷新”按钮后,WPF UI继续引用旧nhibernate会话中的对象,该按钮在数据上下文中调用了刷新,该按钮取消了会话中所有缓存的对象

我需要确保“NotifyChange”被激活以进行UI更新(并且UI正在监听它)。