NHibernate的 - 延迟加载:没有会话或会话关闭
问题描述:
我通过以下NHibernate的行为感到困惑:
域类和映射: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用户界面在我点击对数据进行刷新调用的“刷新”按钮之后,保留了旧的nhibernate会话中对象的引用上下文关联会话中的所有缓存对象。
我需要确保“NotifyChange”被触发以使UI更新(并且UI正在监听它)。
您用于检索cathegory对象的会话已关闭,因此当您试图访问products属性时,它无法访问它。 您可以从原始会话中分离导尿管对象并将其附加到已打开的新会话中,但我认为这似乎不是一个好主意。你为什么想要使用不同的会话? – Paul 2011-04-18 12:41:01
为了显示问题所在,本示例显着简化。在实际的应用程序中,我有几个函数来检索对象。我只是不想将会话传递给他们每个人。 – StuffHappens 2011-04-18 12:45:44
不应该成为“类别”吗? ;) – AGuyCalledGerald 2011-04-18 13:00:38