Я занимаюсь инфраструктурой Entity 4, поскольку приложение уже построено, и мне нужно сделать некоторую градацию в нем.Entity Framework: Atomic Transaction (Database context)
Сценарий: Реализован DBTransaction (вставляет данные в базу данных) в моем коде и один раз транзакция прерывается в середине пути и откат выполняется затем на следующий раз, когда та же самая операция выполняется с правильными/подтвержденных данных до сих пор сделки прервать, предоставив предыдущее исключение. Это довольно сложно понять, поскольку я полагаю, что RollBack должен удалить сообщения проверки и данные из контекста базы данных, так как это SQL. Примечание. Я использую статический DatabaseContext.
public class TestClass
{
static SampleDataBaseEntities ctx = new SampleDataBaseEntities();
public void SqlTransaction()
{
ctx.Connection.Open();
using (DbTransaction transaction = ctx.Connection.BeginTransaction())
{
try
{
Student std = new Student();
std.first_name = "first";
//std.last_name = "last"; (This is responsible for generating the exception)
AddTeacher();
ctx.AcceptAllChanges();
transaction.Commit();
}
catch (Exception e)
{
transaction.Rollback();
}
finally
{
ctx.Connection.Close();
}
}
}
public void SqlTransaction2()
{
ctx.Connection.Open();
using (DbTransaction transaction = ctx.Connection.BeginTransaction())
{
try
{
Student std = new Student();
std.first_name = "first";
std.last_name = "last";
AddTeacher();
ctx.Students.AddObject(std);
ctx.SaveChanges(false);
transaction.Commit();
ctx.AcceptAllChanges();
}
catch (Exception e)
{
transaction.Rollback();
transaction.Dispose();
ctx.Connection.Close();
}
}
}
public void AddTeacher()
{
Teacher t = new Teacher();
t.first_name = "teacher_first";
t.last_name = "teacher_last";
t.school_name = "PUCIT";
ctx.Teachers.AddObject(t);
ctx.SaveChanges(false);
}
}
class Program
{
static void Main(string[] args)
{
TestClass test = new TestClass();
test.SqlTransaction();
test.SqlTransaction2();
}
}
Solutions (который я пробовал): Используя SaveChanges (ложь). Использование SaveChanges (false) и ctx.AcceptAllChanges().
Обход проблемы: Обходной путь, который я получил, заключается в том, чтобы повторно создать экземпляр объекта DatabaseContext.
Как у меня проблемы с сложностью при повторном создании контекста, поэтому поиск более подходящего решения. Спасибо заранее.
Не используйте статический объект DatabaseContext. Создайте его так, как вам нужно. Также не требуется ручная обработка транзакции SQL. – Maarten
Каковы проблемы сложности, возникающие при повторном создании контекста? – Maarten
Не используйте статический DbContext, поскольку он не предназначен для обеспечения безопасности потоков. Также всегда используйте инструкцию 'using', чтобы, если что-то пойдет не так, контекст отменит любые изменения. –