使用 NHibernate 和 C#,我在删除使用属性延迟加载加载的对象时遇到问题。
对象是。
public class Item
{
public virtual Guid ItemID { get; set; }
public virtual string Name { get; set; }
public virtual decimal Price { get; set; }
public virtual string Image { get; set; }
public virtual Iesi.Collections.Generic.ISet<Tax> Taxes { get; set; }
}
“税收”集合在这里加载了延迟加载。所以我需要保持会话开放(据我所知)。加载“项目”对象时,我使用以下查询。
public Item FindByID(Guid itemID)
{
//using(var session = NHibernateHelper.OpenSession())
//using (var tr = session.BeginTransaction())
//{
// return session.Get<Item>(itemID);
//}
var session = NHibernateHelper.OpenSession();
return session.Get<Item>(itemID);
}
在上面的代码中,FindByID()
您可以看到我已经注释掉了一些在从数据库中获取对象后关闭会话的代码。这是因为,我需要打开会话,因为我有Taxes
对象集合可以被懒惰地访问。打开代码部分显示返回找到的对象后会话仍然打开。
不,当我使用上面加载的对象使用以下代码执行删除时。
public void RemoveItem(Item item)
{
using(var session = NHibernateHelper.OpenSession())
using (var tr = session.BeginTransaction())
{
try
{
session.Delete(item);
tr.Commit();
}
catch (Exception Ex)
{
throw Ex;
}
}
}
我收到以下错误..
非法尝试将集合与两个打开的会话相关联
错误很明显,获取的对象已打开会话,当我打开另一个会话以删除同一对象时,会产生此错误。
请有人指导我摆脱这个错误。谢谢。