Pomelo.entityframeworkcore.mysql: Erros nvarchar e nvarchar (max) com projeto ASP.NET Core 3.0 padrão e opção de identidade

Criado em 9 out. 2019  ·  4Comentários  ·  Fonte: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

Passos para reproduzir

Execute o comando Script-Migration.

O Entity Framework Core 3.0.0 inicializou 'ApplicationDbContext' usando o provedor 'Pomelo.EntityFrameworkCore.MySql' com opções: MaxPoolSize = 128 ServerVersion 5.7.22 MySql

O problema

O script SQL gerado para ASP.NET Core Identity contém erros. Recebo mensagens de erro quando tento executar (apenas o primeiro CREATE TABLE) do script em meu banco de dados.
Parece que nvarchar e nvarchar (max) são os problemas.

CRIAR TABELA AspNetRoles (
Id nvarchar (450) NÃO NULO,
Name nvarchar (256) NULL,
NormalizedName nvarchar (256) NULL,
ConcurrencyStamp nvarchar (max) NULL,
RESTRIÇÃO PK_AspNetRoles CHAVE PRIMÁRIA ( Id )
);

4 erros foram encontrados durante a análise.

Tipo de dados não reconhecido. (perto de "nvarchar" na posição 39)
Tipo de dados não reconhecido. (perto de "nvarchar" na posição 75)
Tipo de dados não reconhecido. (perto de "nvarchar" na posição 117)
Tipo de dados não reconhecido. (perto de "nvarchar" na posição 161)
Consulta SQL:

CRIAR TABELA AspNetRoles ( Id nvarchar (450) NÃO NULO, Name nvarchar (256) NULO, NormalizedName nvarchar (256) NULO, ConcurrencyStamp nvarchar (max) NULL, CONSTRAINT PK_AspNetRoles CHAVE PRIMÁRIA ( Id ))

MySQL disse: Documentação

1064 - Você tem um erro em sua sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para a sintaxe correta a ser usada perto de 'max) NULL,

CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)

) 'na linha 5

Mais detalhes técnicos

Versão MySQL: 5.7.22
Sistema operacional: Windows 10
Pomelo.EntityFrameworkCore.MySql versão: 3.0.0-rc1.final
Microsoft.AspNetCore.App versão: 3.0

closed-user-error

Comentários muito úteis

Isso pode acontecer, se você criar um novo projeto ASP.NET Core (com a opção de autenticação habilitada), altere o provedor EF Core para Pomelo.EntityFrameworkCore.MySql e execute uma migração ou comando de atualização.

O problema é que o VS presumiu que você vai usar o SQL Server, então tentou ajudá-lo e já adicionou a migração inicial CreateIdentitySchema aos arquivos .\Data\Migrations\00000000000000_CreateIdentitySchema.cs (contendo o Up e Down operações) e .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (contendo o modelo de destino altamente dependente do banco de dados), que foram gerados usando o provedor SQL Server.

Isso é realmente uma etapa a menos para cuidar, se você estiver usando o SQL Server. No entanto, ele conterá uma migração errada, se você estiver usando qualquer outro provedor de banco de dados.

Se você estiver usando apenas MySQL e não também SQL Server, a maneira mais fácil de corrigir isso é primeiro certificar-se de que UseMySql() está sendo chamado em seu método ConfigureServices :

`` `c #
options.UseMySql (
Configuration.GetConnectionString ("DefaultConnection"));

Then delete the entire `Migrations` folder and just run something similar to the following command, to recreate the initial migration compatible with MySQL:

migrações dotnet ef add CreateIdentitySchema

After that, the newly created initial migration will be compatible with MySQL and other operations based on that migration will be as well.

For example, the `CREATE TABLE` script for `AspNetRoles` when creating a migration script (by using `dotnet ef migrations script`) will look like this:

```sql
CREATE TABLE `AspNetRoles` (
    `Id` varchar(255) NOT NULL,
    `Name` varchar(256) NULL,
    `NormalizedName` varchar(256) NULL,
    `ConcurrencyStamp` longtext NULL,
    CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)
);

Todos 4 comentários

Ao tentar reproduzir # 863, estou recebendo o mesmo erro no comando dotnet ef update database , que usa as mesmas classes de migração em segundo plano. Verificando isso agora.

Isso pode acontecer, se você criar um novo projeto ASP.NET Core (com a opção de autenticação habilitada), altere o provedor EF Core para Pomelo.EntityFrameworkCore.MySql e execute uma migração ou comando de atualização.

O problema é que o VS presumiu que você vai usar o SQL Server, então tentou ajudá-lo e já adicionou a migração inicial CreateIdentitySchema aos arquivos .\Data\Migrations\00000000000000_CreateIdentitySchema.cs (contendo o Up e Down operações) e .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (contendo o modelo de destino altamente dependente do banco de dados), que foram gerados usando o provedor SQL Server.

Isso é realmente uma etapa a menos para cuidar, se você estiver usando o SQL Server. No entanto, ele conterá uma migração errada, se você estiver usando qualquer outro provedor de banco de dados.

Se você estiver usando apenas MySQL e não também SQL Server, a maneira mais fácil de corrigir isso é primeiro certificar-se de que UseMySql() está sendo chamado em seu método ConfigureServices :

`` `c #
options.UseMySql (
Configuration.GetConnectionString ("DefaultConnection"));

Then delete the entire `Migrations` folder and just run something similar to the following command, to recreate the initial migration compatible with MySQL:

migrações dotnet ef add CreateIdentitySchema

After that, the newly created initial migration will be compatible with MySQL and other operations based on that migration will be as well.

For example, the `CREATE TABLE` script for `AspNetRoles` when creating a migration script (by using `dotnet ef migrations script`) will look like this:

```sql
CREATE TABLE `AspNetRoles` (
    `Id` varchar(255) NOT NULL,
    `Name` varchar(256) NULL,
    `NormalizedName` varchar(256) NULL,
    `ConcurrencyStamp` longtext NULL,
    CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)
);

Isso pode acontecer, se você criar um novo projeto ASP.NET Core (com a opção de autenticação habilitada), altere o provedor EF Core para Pomelo.EntityFrameworkCore.MySql e execute uma migração ou comando de atualização.

O problema é que o VS presumiu que você vai usar o SQL Server, então tentou ajudá-lo e já adicionou a migração inicial CreateIdentitySchema aos arquivos .\Data\Migrations\00000000000000_CreateIdentitySchema.cs (contendo o Up e Down operações) e .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (contendo o modelo de destino altamente dependente do banco de dados), que foram gerados usando o provedor SQL Server.

em Pomelo.EntityFrameworkCore.MySql Versão 2.2, funciona sem Excluir e recriar CreateIdentitySchema,

O script de criação de tabela gerou

CREATE TABLE `aspnetroles` (
  `Id` varchar(255) NOT NULL,
  `Name` varchar(256) DEFAULT NULL,
  `NormalizedName` varchar(256) DEFAULT NULL,
  `ConcurrencyStamp` longtext,
  PRIMARY KEY (`Id`),
  UNIQUE KEY `RoleNameIndex` (`NormalizedName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

sem erros,

Espero que 3.0+ funcione da mesma forma para compatibilidade e disponibilidade.

existe algum motivo para essa mudança?

obrigado,

em Pomelo.EntityFrameworkCore.MySql Versão 2.2, funciona sem Excluir e recriar CreateIdentitySchema

Se funcionou para você no Pomelo 2.2 sem nenhuma alteração, então isso é ótimo, mas não pode ser generalizado porque é altamente dependente de sua configuração (e tipo de chave).

Conforme escrito acima, você deve gerar novamente a migração inicial ao criar um novo projeto, para garantir que obtenha uma migração válida e definição de modelo. Do contrário, você está sozinho e pode precisar mexer um pouco no código gerado para fazê-lo funcionar (isso pode ser feito sem muito esforço, dependendo do seu conhecimento em MySQL).

Houve algumas mudanças importantes para a versão 3.0 (que devem ser marcadas apropriadamente), então, para qualquer atualização principal ou secundária, teste seu código primeiro em seu ambiente de desenvolvimento e teste antes de movê-lo para a produção.

sem erros,
[...]
existe algum motivo para essa mudança?

De quais erros e mudanças no 3.0 você está falando concretamente?

Houve muitas mudanças de 2.2.6 para 3.0.0, então fique à vontade para nos postar uma classe de modelo problemática, sua definição, a migração gerada e o script SQL resultante, para que possamos conversar sobre quaisquer problemas que você esteja tendo.

Esta página foi útil?
0 / 5 - 0 avaliações