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; }
}
「Taxes」コレクションは、遅延読み込みで読み込まれます。だから私はセッションを開いたままにしておく必要があります(私が学んだように)。「Item」オブジェクトをロードするとき、私は次のクエリを使用します。
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()
は、オブジェクトがDBからフェッチされると、セッションを閉じるコードをコメントアウトしていることがわかります。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;
}
}
}
次のエラーが発生します。
コレクションを2つの開いているセッションに関連付けようとする違法な試み
エラーは明らかです。フェッチされたオブジェクトはセッションを開きました。同じオブジェクトを削除するために別のセッションを開くと、このエラーが発生します。
誰かがこのエラーを取り除くために私を案内してください。ありがとう。