您好,我正在尝试将事务与 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/