ASP.NET Core 1.0: Using Entity Framework Core 1.0 - Transaction

来源:互联网 发布:java 流量统计代码 编辑:程序博客网 时间:2024/06/05 03:07

跟Entity Framework之前的版本不同,Class DbContext不再有AcceptAllChanges()方法。

使用Transaction需要使用DbContext中的Database对象。

using (var transaction = await _dbContext.Database.BeginTransactionAsync()){    try    {        ... Operation on object        _dbContext.TableA.Add(rowa); // Add rowa to Table A        _dbContext.SaveChanges();        _dbContext.TableB.Add(rowb); // Add rowb to Table B        _dbContext.SaveChanges();        transaction.Commit();    }    catch (Exception exp)    {#if DEBUG        Console.WriteLine(exp.Message);#endif        transaction.Rollback();    }

当然要使用async,必须将对应的Method做调整

[HttpPost]public IActionResult Create([FromBody] MyViewModel ch)

为:

[HttpPost]public async Task<IActionResult> Create([FromBody] MyViewModel ch)

值得强调一下的是,AcceptAllChanges()方法还是存在的,只不过移到了ChangeTracker上了。
看看DbContext的定义

public class DbContext : IDisposable, IInfrastructure<IServiceProvider>{    public DbContext([NotNullAttribute] DbContextOptions options);    protected DbContext();    public virtual ChangeTracker ChangeTracker { get; }    public virtual DatabaseFacade Database { get; }...}

使用AcceptAllChanges()的实例:

// Some tables changed_dbContext.SaveChanges(false);// Other tables changed_dbContext.SaveChanges(false);// Now save it._dbContext.ChangeTracker.AcceptAllChanges();

使用ChangeTracker.AcceptAllChanges()方法有个问题,就是设置为Identity的Column不会自动获取ID,因为SaveChanges(false)表示不向数据库提交修改。对SQL Server来说,只有SaveChanges(),EntityFramework才会调用SCOPE_IDENTITY()来获取下一个ID。

是为之记。
Alva Chien
2016.6.3

0 0
原创粉丝点击