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

跟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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章