如何判断事务是否提交并返回结果?求完善C# EF事务代码返回语句
如何让EF Core事务返回事务执行状态?
我看了你写的代码,首先得提两个容易踩的坑:一是你调用AddAsync的时候没加await,这会导致还没等实体被上下文完全跟踪就执行Commit,大概率会出问题;二是你漏掉了SaveChangesAsync,Add/AddAsync只是把实体标记为待添加状态,真正写入数据库得靠SaveChanges/SaveChangesAsync,这俩问题得先修正~
回到你的核心需求:要返回事务执行的成功/失败状态,我给你两种实现方案,按需选择:
方案一:返回布尔值(简单直接)
把方法返回类型改成Task<bool>,事务提交成功返回true,捕获异常回滚后返回false,代码如下:
// 修改返回类型为Task<bool>,异步返回执行结果 public async Task<bool> Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken)) { using (var transaction = _context.Database.BeginTransaction()) { try { foreach (var item in record) { PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink { PortfolioCompanyId = item.PortfolioCompanyId, URL = item.URL, LinkId = item.LinkId, CreatedBy = _loggedInUser, ModifiedBy = _loggedInUser, CreatedOn = DateTime.UtcNow, ModifiedOn = DateTime.UtcNow }; // AddAsync是异步方法,必须加await等待完成 await _context.PortfolioCompanyLink.AddAsync(portfolioCompanyLink, cancellationToken); } // 新增SaveChangesAsync,将上下文的变更写入数据库 await _context.SaveChangesAsync(cancellationToken); transaction.Commit(); // 提交成功,返回true return true; } catch (Exception ex) { transaction.Rollback(); // 建议这里加日志记录,方便后续排查异常:比如_logger.LogError(ex, "插入PortfolioCompanyLink失败"); // 执行失败,返回false return false; } } }
方案二:返回自定义状态(支持更详细的结果区分)
如果需要区分不同的失败场景(比如输入无效、数据库异常等),可以自定义枚举来封装状态:
// 自定义事务执行状态枚举 public enum TransactionExecutionStatus { Success, DatabaseError, InvalidInput } public async Task<TransactionExecutionStatus> Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken)) { // 先做全局输入校验 if (record == null || !record.Any()) { return TransactionExecutionStatus.InvalidInput; } using (var transaction = _context.Database.BeginTransaction()) { try { foreach (var item in record) { // 单条数据的校验逻辑 if (string.IsNullOrEmpty(item.URL) || item.PortfolioCompanyId <= 0) { return TransactionExecutionStatus.InvalidInput; } PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink { PortfolioCompanyId = item.PortfolioCompanyId, URL = item.URL, LinkId = item.LinkId, CreatedBy = _loggedInUser, ModifiedBy = _loggedInUser, CreatedOn = DateTime.UtcNow, ModifiedOn = DateTime.UtcNow }; await _context.PortfolioCompanyLink.AddAsync(portfolioCompanyLink, cancellationToken); } await _context.SaveChangesAsync(cancellationToken); transaction.Commit(); return TransactionExecutionStatus.Success; } catch (Exception ex) { transaction.Rollback(); // 可根据异常类型细分状态,比如SqlException归为DatabaseError // _logger.LogError(ex, "插入PortfolioCompanyLink时发生数据库异常"); return TransactionExecutionStatus.DatabaseError; } } }
这样调用方就能根据返回的状态值做针对性的处理啦~
内容的提问来源于stack exchange,提问作者Harsha Mullangi
相关产品推荐
相关产品推荐

