我对以下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个会话,我想继续加载懒惰)?
提前谢谢!
答案 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正在监听它)。