バッチで処理されているItemエンティティのリストがあります。次のようなものです。
foreach (var itemId in ItemIdList)
{
var item = getById(itemId); //load line
if(item != null)
{
//...do some processing
delete(item)
}
}
問題は、同じitemIdがItemIdListに複数回リストされる可能性があるため、アイテムを削除した後、アイテムをもう一度ロードしようとすると、ロードラインがエラーで失敗することです。
Unexpected row count: 0; expected: 1 (stale state exception)
エンティティがもう存在しないことは理解していますが、get関数がnullを返すことを期待していました。これが私のgetById関数です:
var item = (from i in UnitOfWork.CurrentSession.QueryOver<T>()
where i.Id == id
select i
).SingleOrDefault();
SingleOrDefaultがnullを返さないのはなぜですか?
私のItemエンティティには自動生成されたキーが1つしかなく、ハッシュ関数は次のようになります。
public override int GetHashCode()
{
int hashCode = 0;
hashCode = hashCode ^ Id.GetHashCode();
return hashCode;
}
編集:
これが私の削除方法です
public void Delete(T t) //T would be Item in this case
{
UnitOfWork.CurrentSession.Delete(t);
}