c# - 了解 Entity Framework 中的事务

标签 c# entity-framework-4 transactions transactionscope

您好,我正在尝试将事务与 Entity Framework 一起使用。网上有这么多关于实现交易的不同方式的信息,我必须说我对正确的方式有点困惑。我有一个包含两个表 Employee 和 Company 的示例数据库。 Employee 表有一个指向公司 ID 的外键。考虑到我想实现一个事务,我在公司表中插入一条记录,然后在员工表中插入一条记录,我想这样做以便只有在两者都成功时才插入记录,我有以下代码。

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() 函数有什么用。任何信息都会有所帮助。

最佳答案

在您的情况下,您不需要管理任何连接或事务:Entity Framework 会为您做这件事。当您不向 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();
    }
}

关于c# - 了解 Entity Framework 中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275352/

相关文章:

c# - Xamarin - iOS map 上的多个多边形

c# - 如果我输入搜索参数,如何让机器人框架机器人发回数据库的单元格?

c# - 哪个具有更好的性能,Action 或 Wiring to Event

c# - 在没有内存泄漏的情况下清除 ListView 项

.net - Entity Framework 将某些 varchar 列的复合键错误地视为身份

mongodb - 'majority committed data' 和 'the snapshot of majority committed data' 有什么区别

entity-framework - 无法检查 Entity Framework CTP5 模型兼容性,因为数据库不包含模型元数据

c# - 在父子关系中具有多个对象的 Linq 查询

mysql - 在 MySQL 中模拟事务安全的 SEQUENCE

java - hibernate +OSIV。 2 笔交易。可重复读取