3
respostas

Update-Database com Erro 2

Ao executar o comando ele falha com as msgs:

PM> update-database
Build started...
Build succeeded.
Failed executing DbCommand (13ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE `AspNetRoles` (
    `Id` int NOT NULL AUTO_INCREMENT,
    `Name` varchar(256) NULL,
    `NormalizedName` varchar(256) NULL,
    `ConcurrencyStamp` text NULL,
    PRIMARY KEY (`Id`)
);
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
      Failed executing DbCommand (13ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE `AspNetRoles` (
          `Id` int NOT NULL AUTO_INCREMENT,
          `Name` varchar(256) NULL,
          `NormalizedName` varchar(256) NULL,
          `ConcurrencyStamp` text NULL,
          PRIMARY KEY (`Id`)
      );
MySql.Data.MySqlClient.MySqlException (0x80004005): Table 'aspnetroles' already exists
   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Table 'aspnetroles' already exists

Código do migration:

sing Microsoft.EntityFrameworkCore.Migrations;

namespace UsuariosApi.Migrations
{
    public partial class usuarioadmin : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.InsertData(
                table: "AspNetRoles",
                columns: new[] { "Id", "ConcurrencyStamp", "Name", "NormalizedName" },
                values: new object[] { 99999, "827d680a-9404-4471-962a-3e222aeb4cf8", "admin", "ADMIN" });

            migrationBuilder.InsertData(
                table: "AspNetUsers",
                columns: new[] { "Id", "AccessFailedCount", "ConcurrencyStamp", "Email", "EmailConfirmed", "LockoutEnabled", "LockoutEnd", "NormalizedEmail", "NormalizedUserName", "PasswordHash", "PhoneNumber", "PhoneNumberConfirmed", "SecurityStamp", "TwoFactorEnabled", "UserName" },
                values: new object[] { 99999, 0, "1d11ca38-2199-446a-a4eb-a22be449fe37", "admin@admin.com", true, false, null, "ADMIN@ADMIN.COM", "ADMIN", "AQAAAAEAACcQAAAAEBVA+w9gUFghtwZSfWJP9HZi8PYjJeZhRkls3AAbQ0WMQqSgLWtN1asG4jFJbxCwkA==", null, false, "6045940e-4756-4ff0-aac9-045b404d876a", false, "admin" });

            migrationBuilder.InsertData(
                table: "AspNetUserRoles",
                columns: new[] { "RoleId", "UserId" },
                values: new object[] { 99999, 99999 });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DeleteData(
                table: "AspNetUserRoles",
                keyColumns: new[] { "RoleId", "UserId" },
                keyValues: new object[] { 99999, 99999 });

            migrationBuilder.DeleteData(
                table: "AspNetRoles",
                keyColumn: "Id",
                keyValue: 99999);

            migrationBuilder.DeleteData(
                table: "AspNetUsers",
                keyColumn: "Id",
                keyValue: 99999);
        }
    }
}
3 respostas

Olá Cláudia, passei pela mesma situação. Isso acontece, porque na migration anterior do banco de dados foi criada a tabela 'aspnetroles' e quando solicitamos a nova migration, o banco está com essa dificuldade pois já existe uma tabela com esse nome.

Tentei excluir apenas a tabela aspnetroles porém não obtive êxito, então optei em excluir o banco de dados correspondente ao projeto usuariosAPI(que o instrutor deu o nome de "usuariodb".

Para excluir o banco, baste digitar no MYSQL: DROP DATABASE usuariodb;

Ao excluir o banco, retorne ao projeto e faça o processo de Add-Migration novamente, agora acredito que estará tudo certo.

Outra solução que pode te ajudar de forma mais eficiente nesse caso é, antes de rodar a migração com o "Update-Database", remover o trecho que recria a tabela.

Como o projeto do curso não é definitivo até que a formação seja completa (Formação ASP.NET Core REST APIs), excluir o banco inteiro também não é uma saída ruim. Caso tenha dados nas tabelas que queira manter, faça um backup disso e importe depois esses registros, ou crie um JSON para enviar ao endpoint novamente.

Verifica também outros tópicos aqui no fórum porque tem um erro semelhante, relacionado à migração.

Aqui sempre antes de dar o update database(depois de criar um migration) eu mudo todos os varchar(767) para varchar(256). e resolve

Você pode excluir o banco e renomear na migration, ai da o updatedatabse