Alterar coluna restrita única no EF Core usando uma transação

grokky

Estou usando EF Core (dentro do ASP.NET Core e minhas DbContextvidas por solicitação / escopo).

Minha Employeeentidade possui esta propriedade:

public bool? IsBoss { get; set; }

e esta configuração:

entityBuilder.Property(b => b.IsBoss).IsRequired(false);
entityBuilder.HasIndex(b => b.IsBoss).IsUnique();

Isso cria um índice filtrado, portanto, pode haver apenas um verdadeiro, um falso, mas muitos nulos.

Meu aplicativo exige que eu sempre tenha exatamente um funcionário com IsBoss==true.

Suponha que eu queira trocar dois funcionários.

employee1.IsBoss = null;
employee2.IsBoss = true;
context.SaveChanges();

Isso lança uma exceção de violação de restrição exclusiva.

Posso consertar isso envolvendo-o em uma transação:

using (var transaction = context.BeginTransaction())
{
  try
  {
    employee1.IsBoss = null;
    context.SaveChanges();

    employee2.IsBoss = true;
    context.SaveChanges();

    transaction.Commit();
  }
  catch
  {
    transaction.Rollback();
  }
}

Minha pergunta é: por que a primeira abordagem falha? Achei que o EF Core automaticamente envolve tudo em uma transação. Por que devo usar uma transação?

Smit

A primeira abordagem falha devido a um motivo diferente do das transações. Rastreamento de problema no repositório EF que cobre o mesmo cenário que o seu.

Quando SaveChangesé chamado, o EF processa as alterações e calcula os comandos a serem enviados ao banco de dados. Este conjunto de comandos pode ter dependência. Como no seu caso, você precisa definir o valor nullpara employee1antes de definir o valor truepara employee2. EF faz a classificação dos comandos para descobrir a ordem em que eles precisam ser executados. EF fez essa classificação com base nas restrições de chave estrangeira. Mas, como esse problema relatou, não contabilizamos o índice exclusivo, portanto os comandos estavam sendo enviados na ordem errada, causando violação de restrição exclusiva.

O problema já foi corrigido na base de código atual. Ele estará disponível no próximo lançamento público. Enquanto isso, como uma solução alternativa, você precisa chamar SaveChangesduas vezes, como está fazendo no segundo código. Chamando SaveChangesvárias vezes, você pode controlar a ordem dos comandos enviados ao banco de dados. Você não precisa envolvê-lo em uma transação, a menos que queira que ambas as alterações sejam uma operação atômica. Cada um SaveChangestem sua própria transação, a menos que o usuário inicie uma.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Não é possível alterar a coluna com Restrição Única com Índice usando EF Core

como alterar o estado da janela principal em uma única instância usando .Net Core

EF Core 3 para atualizar uma única coluna em vez de uma linha completa

Mesclando duas tabelas usando SQL para alterar os dados da coluna em uma única linha

EF CORE - API Fluent - exclusão em cascata restrita à tabela

python: imprime uma única coluna usando o separador de campo

Filtrar usando a condição AND com base em uma única coluna

Erro Cassandra - a coluna de cluster não pode ser restrita (a coluna anterior é restrita por uma relação não EQ)

Erro Cassandra - a coluna de cluster não pode ser restrita (a coluna anterior é restrita por uma relação não EQ)

Como acessar uma coluna em outra tabela usando o EF Core enquanto houver relação entre essas tabelas

Mova os dados de uma coluna para outra em uma única transação / chamada de API

Consulta PostgreSQL para renomear e alterar o tipo de coluna com uma única consulta

Como alterar o tipo de dados para uma única coluna para vários dataframes em pandas?

EF Core - eliminando uma solução alternativa de coluna (sqlite)

Como evitar uma atualização de coluna no EF Core 3.1?

Alterar o caso de uma única palavra em uma string usando o Apple Script

Por que o código EF não está selecionando uma única coluna?

É possível usar uma única transação (no EF) com dois contextos diferentes apontando esquemas diferentes?

Como a agregação de medidas pode ser restrita a uma única dimensão no membro calculado

Pode EF Core Order por uma coluna não selecionada (EF Core Net 5)

Classificando uma matriz tridimensional por uma única linha / coluna em Python - usando vetorização

Alterar o código de saída em uma única linha usando o Bash?

Alterar o tempo de uma única célula em CSV usando o PowerShell

Diminua e aumente uma coluna no EF Core

Como posso group_by () e então concatenar valores de uma coluna em uma única coluna em R usando dplyr?

Como alterar dados em uma coluna usando o comprimento maior de uma string no PANDAS?

Como alterar dados em uma coluna usando o comprimento maior de uma string no PANDAS?

Como alterar o nome de uma coluna de uma tabela no banco de dados usando PSQL?

Usando a instrução ifelse em todo o conjunto de dados em vez de uma única coluna

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo