Как выполнить ручную SQL как часть вызова SaveChanges в Entity Framework Core? - PullRequest
0 голосов
/ 24 апреля 2020

Я ищу способ добавить необработанный вызов 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. Если есть способ внедрить мою модификацию в SQL, созданный SaveChanges - это то, что я ищу.

1 Ответ

1 голос
/ 24 апреля 2020

Я использую перегрузку для SaveChangesAsyn c на моей базе DbContext, которая принимает любое произвольное необработанное значение 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 в мои бизнес-исключения, поэтому этот метод здесь не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...