繁体   English   中英

如何在 Entity Framework Core 中执行手动 SQL 作为 SaveChanges 调用的一部分?

[英]How to execute manual SQL as part of SaveChanges call in Entity Framework Core?

我正在寻找一种将手动原始 SQL 调用添加到标准 AppDbContext 交互的方法。 假设我有以下代码:

Message m = new Message
{
    Title = message.Title,
    Body = message.Body,
    Date = DateTime.Now,
    Foo = "foo"
};

_context.Messages.Add(m);
// Add some manual UPDATE SQL here, like:
// UPDATE SomeOtherTable SET Foo = 'Something' WHERE SomeComplex = 'Condition'

_context.SaveChanges();

最重要的是使手动 SQL 作为 SaveChanges 的一部分创建和执行的命令/事务的一部分。 如果有办法将我的修改注入 SaveChanges 生成的 SQL - 这就是我正在寻找的。

我在我的 DbContext 基础上使用 SaveChangesAsync 的重载,它接受任何任意原始 sql,关键是将所有处理包装在手动创建的事务中:

  public async Task<int> SaveChangesAsync(string customCommand,
        CancellationToken cancellationToken = default(CancellationToken),
        params object[] parameters)
    {
        using (var transaction = Database.BeginTransaction())
        {
            try
            {
                var result = await base.SaveChangesAsync(true, cancellationToken);

                await Database.ExecuteSqlCommandAsync(customCommand, parameters);
                transaction.Commit();

                return result;
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw ex.Handle();
            }
        }
    }

注意:Handle() 是一种扩展方法,我将 t-sql 异常转换为我的业务异常,因此该方法与此处无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM