繁体   English   中英

了解实体框架中的事务

[英]Understanding Transactions in Entity Framework

嗨,我试图与实体框架一起使用交易。 由于在线提供了大量有关实施交易的不同方式的信息,我必须说我在正确的方式上有点困惑。 我有一个带有两个表Employee和Company的示例数据库。 Employee表有一个引用公司Id的外键。 考虑到我想要实现一个事务,我将一条记录插入到Company表中,然后一条记录到Employee表,我想这样做,这样只有两个记录都成功时才插入记录我有以下代码。

public void addCompanyToDatabase()
    {
        using (var context = new myTestEntities())
        {
            context.Connection.Open(); //added this as was getting the underlying   
            //provider failed to open
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    Company c = new Company();
                    c.Name = "xyz";
                    context.Companies.AddObject(c);
                    context.SaveChanges();

                    //int a = 0;
                    //int b = 5 / a;

                    Employee e = new Employee();
                    e.Age = 15;
                    e.Name = "James";
                    e.CompanyId = c.Id;
                    context.Employees.AddObject(e);
                    context.SaveChanges();

                    scope.Complete();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception Occurred");
                }
            }
        }
    }

我想知道这是否是实现交易的正确方法。 如果是那么使用SaveChanges(false)scope.AcceptAllChanges()函数是什么。 任何信息都有帮助。

在您的情况下,您不需要管理任何连接或事务:实体框架将为您执行此操作。 如果不为打开的连接提供EF(但使用连接字符串),它将打开连接并在调用context.SaveChanges()期间启动事务。 在该调用期间出现故障时,将回滚该事务。

换句话说,您的方法可以简单地看起来像这样:

public void addCompanyToDatabase()
{
    using (var context = new myTestEntities())
    {
        Company c = new Company();
        c.Name = "xyz";
        context.Companies.AddObject(c);

        Employee e = new Employee();
        e.Age = 15;
        e.Name = "James";
        e.CompanyId = c.Id;
        context.Employees.AddObject(e);

        // Only call SaveChanges last.
        context.SaveChanges();
    }
}

1 - 此服务 (我认为交易服务)必须在客户端运行才能支持TransactionScope

2 - 当您在应用程序中有两个或更多数据库并且希望所有数据库更新事务时(例如更改上下文的连接字符串)时有用。

3 - 当你有一个数据库时,最好使用内部实现事务的SaveChanges()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM