实体框架:原子事务(数据库上下文)

时间:2016-10-13 07:45:45

标签: c# sql .net

我正在处理实体框架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对象。

因为我在重新实例化上下文时遇到了复杂性问题,这就是寻找更合适的解决方案的原因。 提前谢谢。

2 个答案:

答案 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并在事务完成后立即将其销毁。 希望它能奏效!