EF Code First DBContext 和事务

Posted

技术标签:

【中文标题】EF Code First DBContext 和事务【英文标题】:EF Code First DBContext and Transactions 【发布时间】:2011-08-27 02:00:00 【问题描述】:

我想知道用DBContext 实现交易的最佳方式是什么。特别是,

    如果我更改多个实体,DbContext.SaveChanges 是否在内部实现事务? 如果我想多次调用DbContext.SaveChanges(相同的contxet/不同的contxets),如何实现交易?

【问题讨论】:

【参考方案1】:
    是的。 SaveChanges 在内部使用事务。 使用TransactionScope 包装对SaveChanges 的多个调用

例子:

using(var scope = new TransactionScope(TransactionScopeOption.Required,
    new TransactionOptions  IsolationLevel = IsolationLevel.ReadCommitted ))

    // Do something 
    context.SaveChanges();
    // Do something else
    context.SaveChanges();

    scope.Complete();

【讨论】:

确保使用 Sql 2008 或更高版本作为数据库(或在客户端上运行 MSDTC 服务)。以前的版本会将事务升级为第二个SaveChanges 上的分布式事务。这是由于DbContext 在内部如何处理其连接的打开和关闭。 是否可以从第一次保存更改中获取身份?我总是看到 Id = 0。 @JarrettV - 我认为您的问题是由于 IsolationLevel 设置。降低它可能会有所帮助... 这不适用于 EF 4.3.1。在调用 context.SaveChanges() 之前,我们必须显式打开 Objectcontext 上的连接。 @renegadeMind:这当然适用于 DbContext。您所描述的是当您想要避免分布式事务时使用的高级方式。

以上是关于EF Code First DBContext 和事务的主要内容,如果未能解决你的问题,请参考以下文章

EF code first 怎样创建数据库视图

在 EF 6 / Code First 中按键查找本地缓存的实体

EF6 Code First Lazy Load导致空集合

Code First开发方式

EF Core开发模式之Code First

EF Code first主从表,删除更新从表