实体框架:原子事务(数据库上下文)
本文关键字:数据库 上下文 事务 框架 实体 | 更新日期: 2023-09-27 18:12:48
我正在处理实体框架4,因为应用程序已经构建,我必须在其中做一些渐变。
场景:在我的代码中实现了一个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();
}
}
解决方案(我已经尝试过):使用SaveChanges(false)。使用SaveChanges(false)和ctx.AcceptAllChanges().
处理:我得到的解决办法是重新实例化DatabaseContext对象。
因为我有复杂性的问题,而重新实例化上下文,这就是为什么寻找一个更合适的解决方案。
所有问题都来自没有创建上下文的新实例。把你的代码简化成这样,它应该可以工作。
using (var ctx = new SampleDataBaseEntities()) {
Student std = new Student();
std.first_name = "first";
std.last_name = "last";
ctx.Student.Add(std);
ctx.SaveChanges();
}
"我得到的解决办法是重新实例化DatabaseContext对象。"
yes,这对于再次执行事务是正确的。由于您使用的是静态数据上下文,因此下次执行事务时使用的数据上下文会导致重输入数据和验证错误。
解决方案:尽量不要使用静态数据上下文,因为你正在做事务非常快。因此,您需要为每个事务更新数据上下文。因此,总是尝试实例化一个新的dataContext,并在事务完成后立即销毁它。希望它会起作用!