npoco를 사용하여 트랜잭션 작업을하려고하는데 AbortTransaction
메서드를 db에서 롤백 할 수 없습니다. 테스트 클래스에서왜 AbortTransaction이 작동하지 않습니까?
public class ItemRepository
{
private Func<Database> _db;
public ItemRepository(Func<Database> db)
{
_db = db;
}
Public void Update(){
using (_db().Transaction)
{
_db().BeginTransaction();
foreach (var item in itemToUpdate.Items)
{
_db().Insert(item);
if (SomethingIsNotCorrect())
{
_db().AbortTransaction();
}
}
_db().CompleteTransaction();
}
}}
전화 :
_db =() => new Database(String.Format("DataSource={0};Persist Security Info=False;", DbPath),"System.Data.SqlServerCe.4.0");
_itemRepository = new ItemRepository(() => _db());
_itemRepository.Update();
------------- 편집 후 제안 답 :
var db = _db();
using (db.Transaction)
{
db.BeginTransaction();
foreach (var item in itemToUpdate.Items)
{
db.Insert(item);
db.Transaction.Commit();
if (GetNutrientConns(itemToUpdate).Count > 2)
{
db.AbortTransaction();
}
}
db.CompleteTransaction();
}
는 지금은 DB를 사용해야합니다. Transaction.Commit()는 db에 무언가를 삽입합니다. 그런 다음 db.AbortTransaction()을 실행할 때 오류 메시지가 나타납니다.
"이 SqlCeTransaction이 완료되어 더 이상 사용할 수 없습니다."
_db()는 무엇입니까? 말하지 말아요 새로운 DB 연결을 반환하는 방법입니다 – Reniuz
@ Renenuz, private Func _db; 이 생성자에서 한 번 설정하면 한 번에 같아야합니다. –
@daniel_aren 전에이 라이브러리를 사용한 적이 없지만 한 번 호출하여 결과를 필드 또는 변수에 저장하고 참조해야합니다. 자꾸. –