Я хотел бы использовать класс TransactionScope в своем бизнес-уровне:
В классе AdminService:
public void DeleteSchoolclass(Schoolclass schoolclass)
{
using (var trans = new TransactionScope())
{
adminProvider.DeleteSchoolclass(schoolclass.SchoolclassId);
timetableProvider.DeleteTimeTableEntry(schoolclass.SchoolclassCode);
trans.Complete();
}
}
Когда я отлаживаю оба метода Delete, для свойства Transaction каждого объекта команды Delete внутри поставщика данных устанавливается значение NULL, поэтому кажется, что транзакции нет ... Как узнать, используется транзакция или нет?
Когда я отлаживаю объект транзакции, я не могу найти никакого соединения ...
TransactionScope выглядит как волшебство ...
Это метод в моем классе DataAccess:
public static SQLiteConnection ConnectionManager
{
get
{
if (_con == null)
{
_con = new SQLiteConnection(@"Data Source=C:\TBM\Database\dev.db");
_con.Open();
SQLiteCommand command = new SQLiteCommand(sqlString, _con);
command.ExecuteNonQuery();
}
return _con;
}
}
мое соединение всегда открыто, так как не имеет смысла закрывать его для каждой команды sql, имеющей одно поточное приложение.
UPDATE:
public void AddPupil(int schoolclassCodeID, Pupil pupil)
{
using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction())
{
using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager))
{
com.Parameters.Add(new SQLiteParameter("@FirstName", pupil.FirstName));
com.Parameters.Add(new SQLiteParameter("@LastName", pupil.LastName));
com.Parameters.Add(new SQLiteParameter("@Gender", pupil.Gender));
com.Parameters.Add(new SQLiteParameter("@Street", pupil.Street));
com.Parameters.Add(new SQLiteParameter("@City", pupil.City));
com.Parameters.Add(new SQLiteParameter("@Postal", pupil.Postal));
com.Parameters.Add(new SQLiteParameter("@Phone", pupil.Phone));
com.Parameters.Add(new SQLiteParameter("@SchoolclassId", schoolclassCodeID));
com.CommandText = "INSERT INTO PUPIL (Firstname,LastName,Gender,Street,City,Postal,Phone,SchoolclassId_FK)" +
" VALUES(@FirstName,@LastName,@Gender,@Street,@City,@Postal,@Phone,@SchoolclassId)";
com.ExecuteNonQuery();
com.CommandText = "SELECT last_insert_rowid() as lastID";
pupil.Id = Convert.ToInt32(com.ExecuteScalar());
}
trans.Commit();
}
}