我正在处理实体框架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对象。
因为我在重新实例化上下文时遇到了复杂性问题,这就是寻找更合适的解决方案的原因。 提前谢谢。
答案 0 :(得分:2)
所有问题都来自于不创建上下文的新实例。简化你的代码,它应该工作。
using (var ctx = new SampleDataBaseEntities()) {
Student std = new Student();
std.first_name = "first";
std.last_name = "last";
ctx.Student.Add(std);
ctx.SaveChanges();
}
答案 1 :(得分:0)
"我得到的解决方法是重新实例化DatabaseContext对象。"
是的,再次进行交易是正确的。 由于您正在使用静态数据上下文,因此在下次执行事务时会使用相同的数据上下文,这会导致重新输入数据和验证错误。
解决方案:尝试永远不要使用静态dataContext,因为您很快就会进行交易。因此,您需要为每个事务更新datacontext。所以总是尝试实例化一个新的dataContext并在事务完成后立即将其销毁。 希望它能奏效!