AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79171205
Accepted
Mehmet
Mehmet
Asked: 2024-11-09 02:39:39 +0800 CST2024-11-09 02:39:39 +0800 CST 2024-11-09 02:39:39 +0800 CST

.Net Blazor id A instrução MERGE entrou em conflito com o problema de restrição FOREIGN KEY

  • 772

Estou trabalhando em um projeto e há um treinador que sigo. Quando cheguei ao processo de atualização, comecei a obter um erro, quando fui com Breakpoints, percebi que o valor QuizId veio 0000 na fase de salvamento. Quando verifico o banco de dados, todas as minhas conexões estão corretas, os valores de id também estão disponíveis, mas tenho um problema com a saída.

Perguntas.cs

[Key]
public Guid Id { get; set; }
public string Text { get; set; }

public Guid QuizId { get; set; }
[ForeignKey(nameof(QuizId))]
public virtual Quiz Quiz { get; set; }

public virtual ICollection<Options> Options { get; set; } = [];

Opções.cs

[Key]
public int Id { get; set; }

public string Text { get; set; }
public bool IsCorrect { get; set; }
public Guid QuestionId { get; set; }

[ForeignKey(nameof(QuestionId))]
public virtual Questions Questions { get; set; }

Questionário.cs

  [Key]
  public Guid Id { get; set; }
  public string? Name { get; set; }
  public int TotalQuestions { get; set; }
  public int TimeInMinutes { get; set; }
  public bool IsActive { get; set; }

  public Guid CategoryId { get; set; }
  [ForeignKey(nameof(CategoryId))]
  public virtual Category? Category { get; set; }

  public ICollection<Questions> Questions { get; set; } = [];

abaixo está o bloco de código que usei para salvar os dados

public async Task<QuizApiResponse> SaveQuizAsync(QuizSaveDto dto)
{
    var questions = dto.Question.Select(q => new Questions
    {
        Id = Guid.NewGuid(),
        Text = q.Text,
        Options = q.Option.Select(o => new Options
        {
            Id = 0,
            Text = o.Text,
            IsCorrect = o.IsCorrect
        }).ToArray()
    }).ToArray();

    if (dto.Id == Guid.Empty)
    {

        var quiz = new Quiz
        {
            Id = Guid.NewGuid(),
            Name = dto.Name,
            CategoryId = dto.CategoryId,
            TotalQuestions = dto.TotalQuestions,
            TimeInMinutes = dto.TimeInMinutes,
            IsActive = dto.IsActive,
            Questions = questions
        };
        _context.Quizzes.Add(quiz);
    }
    else
    {
        var dbQuiz = await _context.Quizzes.FirstOrDefaultAsync(q => q.Id == dto.Id);//QuizId have
        if (dbQuiz == null)
        {
            return QuizApiResponse.Fail("Quiz doesn't exists");
        }
        dbQuiz.CategoryId = dto.CategoryId;
        dbQuiz.IsActive = dto.IsActive;
        dbQuiz.Name = dto.Name;
        dbQuiz.TimeInMinutes = dto.TimeInMinutes;
        dbQuiz.TotalQuestions = dto.TotalQuestions;
        dbQuiz.Questions = questions;//QuizId is 0000

        _context.Quizzes.Update(dbQuiz);// burada QuizId null
    }

    try
    {
        await _context.SaveChangesAsync();
        return QuizApiResponse.Success();
    }
    catch (Exception ex)
    {
        return QuizApiResponse.Fail(ex.Message);
    }
}

aqui está um visual do meu esquema de banco de dadosbanco de dados

o ponto que detectei quando prossegui com o ponto de interrupção insira a descrição da imagem aqui

o erro que recebo é o seguinte

Microsoft.EntityFrameworkCore.Update[10000] Ocorreu uma exceção no banco de dados ao salvar alterações para o tipo de contexto 'BlazingQuiz.Api.Data.Repositories.QuizContext'. Microsoft.EntityFrameworkCore.DbUpdateException: Ocorreu um erro ao salvar as alterações da entidade. Consulte a exceção interna para obter detalhes. ---> Microsoft.Data.SqlClient.SqlException (0x80131904): A instrução MERGE entrou em conflito com a restrição FOREIGN KEY "FK_Options_Questions_QuestionId". O conflito ocorreu no banco de dados "BlazingQuiz", tabela "dbo.Questions", coluna 'Id'. em Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Ação 1 wrapCloseInAction) at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) em Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)

sql
  • 1 1 respostas
  • 37 Views

1 respostas

  • Voted
  1. Best Answer
    Steve Py
    2024-11-09T19:21:47+08:002024-11-09T19:21:47+08:00

    O problema provavelmente está em torno de como você está fazendo sua atualização. Para começar, quando você tem uma propriedade de navegação de coleção, você nunca deve expor ou usar um setter. Por exemplo, com Quiz.Questions, isso deve ser:

    public virtual ICollection<Questions> Questions { get; } = [];
    

    Nenhum setter. Qualquer código que use um setter causará problemas. Quando você carrega um quiz existente para atualizar as perguntas, não pode simplesmente substituir a referência da coleção por um novo conjunto, como pode com coleções na memória. O quiz tem perguntas atribuídas a ele, então você precisa determinar quais itens adicionar ou remover, ou remover todos e adicionar completamente novos, desde que a nova lista de perguntas tenha IDs completamente novos e exclusivos. Definir uma coleção de propriedades de navegação causa todos os tipos de problemas porque remove o proxy de rastreamento que o EF teria ao ler a coleção e não sabe depois do fato "deletar a coleção inteira" quando vai salvar as alterações depois que essa referência é detonada.

    Então, ao carregar o Quiz existente, carregue ansiosamente as perguntas existentes:

    var dbQuiz = await _context.Quizzes
        .Include(q => q.Questions)
        .FirstOrDefaultAsync(q => q.Id == dto.Id);
    

    A partir daí, para substituir a lista de perguntas por novas:

    dbQuiz.Questions.Clear();
    foreach(var question in questions)
        dbQuiz.Questions.Add(question);
    

    por fim, para salvar as alterações, não use Update. Updateé usado para entidades desanexadas e ignora o rastreamento do rastreador de alterações para modificações. Quando você carrega o Quiz e as perguntas, por padrão, essas são entidades de rastreamento, então tudo o que você precisa fazer é chamar SaveChanges()depois de fazer suas alterações:

    await _context.SaveChangesAsync();
    

    O EF gerenciará todas as atribuições de FK para as entidades relacionadas. A única outra etapa que pode ser necessária em termos de tratamento das perguntas órfãs removidas do quiz é que você pode precisar marcá-las explicitamente como excluídas se o relacionamento do banco de dados não estiver configurado para excluir órfãos:

    _context.Questions.RemoveRange(dbQuiz.Questions); // This step might be needed.
    dbQuiz.Questions.Clear();
    

    Espero que isso o deixe mais perto de uma solução funcional.

    • 1

relate perguntas

  • Atualizando todas as linhas, exceto uma que tenha os mesmos valores em determinadas colunas

  • Existe uma maneira de inverter apenas os números quando eu retornar uma coluna sql? (hebraico)

  • SQL menor/maior comparação entre booleanos produz resultados inesperados

  • Como atualizar valores na tabela Postgres com base em uma correspondência em uma matriz

  • Como somar colunas no sql server

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve