Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como rastrear o motivo de um erro em um add-migration?

Eu estou fazendo um add-migration com mappings para as entidades, porém está dando um erro e não sei onde ver o motivo do erro. using System; #nullable disable namespace TCM.RH.Data.Migrations { /// public partial class CriacaoBDTCMSistemaRHVotacao : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "TLotacaoVotacao", columns: table => new { idLotacaoVotacao = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), codLotacao = table.Column(type: "nvarchar(64)", nullable: false), idLotaocaoVotacaoVotacao = table.Column(type: "int", nullable: false), lotacao = table.Column(type: "nvarchar(80)", maxLength: 80, nullable: false) }, constraints: table => { table.PrimaryKey("PK_LotacaoVotacao", x => x.idLotacaoVotacao); });

        migrationBuilder.CreateTable(
            name: "TOpcaoVoto",
            columns: table => new
            {
                idOpcaoVoto = table.Column<int>(type: "int", nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                nmOpcaoVoto = table.Column<string>(type: "nvarchar(80)", maxLength: 80, nullable: false),
                dsOpcaoVoto = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
                idOpcaoVotoVotacao = table.Column<int>(type: "int", nullable: false),
                ordem = table.Column<int>(type: "int", nullable: false),
                imagem = table.Column<string>(type: "nvarchar", nullable: false),
                linksite = table.Column<string>(type: "nvarchar(2048)", maxLength: 2048, nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_OpcaoVoto", x => x.idOpcaoVoto);
            });

        migrationBuilder.CreateTable(
            name: "TVotacao",
            columns: table => new
            {
                idVotacao = table.Column<int>(type: "int", nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                titulo = table.Column<string>(type: "nvarchar(150)", maxLength: 150, nullable: false),
                dsVotacao = table.Column<string>(type: "nvarchar(300)", maxLength: 300, nullable: false),
           (...//suprimi uns campos para poder enviar a msg))
                mensagemEmail = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Votacao", x => x.idVotacao);
            });

        migrationBuilder.CreateTable(
            name: "TVoto",
            columns: table => new
            {
                idVoto = table.Column<int>(type: "int", nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                cpf = table.Column<string>(type: "nvarchar(11)", maxLength: 11, nullable: false),
                idVotoVotacao = table.Column<int>(type: "int", nullable: false),
                idVotoOpcaoVoto = table.Column<int>(type: "int", nullable: false),
                dtVoto = table.Column<DateTime>(type: "datetime2", nullable: false),
                chapa = table.Column<string>(type: "nvarchar(6)", maxLength: 6, nullable: false),
                ipMaquina = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Voto", x => x.idVoto);
            });
    }

    /// <inheritdoc />
    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "TLotacaoVotacao");
        migrationBuilder.DropTable(
name: "TOpcaoVoto");
        migrationBuilder.DropTable(
            name: "TVotacao");
        migrationBuilder.DropTable(
            name: "TVoto");
    }
}

}

4 respostas

Olá Ana, bom dia.

Vamos tentar identificar o problema juntos. Aqui estão algumas dicas que podem te ajudar a rastrear o motivo do erro:

  1. Verifique o Console de Saída: Quando você executa o comando add-migration, o console do Visual Studio ou do terminal onde você está rodando o comando geralmente fornece uma mensagem de erro detalhada. Essa mensagem pode conter informações valiosas sobre o que está causando o problema.

  2. Verifique os Logs de Erro: Além do console, você pode habilitar o logging para ver mensagens mais detalhadas. No arquivo appsettings.json ou appsettings.Development.json, você pode configurar o nível de log para Debug ou Trace para obter mais informações.

  3. Cheque os Mapeamentos e Anotações: Revise suas entidades e mapeamentos. Erros comuns incluem:

    • Inconsistências nos nomes das colunas ou tabelas.
    • Tipos de dados incorretos.
    • Anotações incorretas ou faltantes, como [Key] para chaves primárias.
  4. Relacionamentos e Chaves Estrangeiras: Verifique se todos os relacionamentos entre as entidades estão corretamente configurados. Às vezes, um erro pode ocorrer devido a uma chave estrangeira mal configurada ou ausente.

  5. Erros de Sintaxe: Certifique-se de que não há erros de sintaxe no seu código. Um parêntese ou vírgula faltando pode causar problemas.

  6. Atualize o Entity Framework: Certifique-se de que você está usando a versão mais recente do Entity Framework, pois algumas versões mais antigas podem ter bugs que já foram corrigidos.

Como exemplo, se o erro estiver relacionado a um tipo de dado, você pode verificar se o tipo de dado no código corresponde ao tipo de dado no banco de dados. Por exemplo, se você tiver uma coluna imagem definida como nvarchar sem especificar o tamanho, isso pode gerar um erro.

Espero ter ajudado e bons estudos!

Bom dia! obrigada pelo retorno acima.

O add-migration voltou a executar parcialmente - criou 3 das 4 tabelas. Porém está com o seguinte erro - Error Number:1785,State:0,Class:16 Introducing FOREIGN KEY constraint 'FK_TVoto_TOpcaoVoto_OpcaoVotoidOpcaoVoto' on table 'TVoto' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index. See previous errors.

O banco terá uma tabela mãe e 3 tabelas filhas, sendo que uma tabela filha também terá um relacionamento de 1 para n com a outra tabela filha. Li que isso é possível, porém não está funcionando e continua a dar o mesmo erro.

solução!

Olá Ana, bom dia.

Pela mensagem de erro, parece que existe dependências circulares. Tipo:

Duas ou mais tabelas relacionadas entre si de forma circular (ou seja, TVoto depende de TOpcaoVoto, e TOpcaoVoto depende de outra tabela que, direta ou indiretamente, depende de TVoto).

Como uma possível solução você poderia rever seus mapeamentos de chave estrangeira, tipo no seu onmodelcreating configurar manualmente:

modelBuilder.Entity<TVoto>()
    .HasOne(v => v.TOpcaoVoto)
    .WithMany(o => o.TVotos)
    .HasForeignKey(v => v.OpcaoVotoidOpcaoVoto)
    .OnDelete(DeleteBehavior.Restrict);

Caso essas sugestões e observações não ajudarem, e se puder, compartilhe conosco o repo do projeto, ajudaria muito na busca da solução.

André, muito obrigada! resolveu com isso (.OnDelete(DeleteBehavior.Restrict).