You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断事务是否提交并返回结果?求完善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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:03:35