Pomelo.entityframeworkcore.mysql: デフォルトのASP.NETCore 3.0プロジェクトとIDオプションでのnvarcharおよびnvarchar(max)エラー

作成日 2019年10月09日  ·  4コメント  ·  ソース: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

再現する手順

Script-Migrationコマンドを実行します。

Entity Framework Core 3.0.0は、プロバイダー「Pomelo.EntityFrameworkCore.MySql」をオプションで使用して「ApplicationDbContext」を初期化しました:MaxPoolSize = 128 ServerVersion 5.7.22 MySql

問題

ASP.NET CoreIdentity用に生成されたSQLスクリプトにエラーが含まれています。 データベースでスクリプトを(最初のCREATE TABLEだけで)実行しようとすると、エラーメッセージが表示されます。
nvarcharとnvarchar(max)が問題のようです。

CREATE TABLE AspNetRoles
Id nvarchar(450)NOT NULL、
Name nvarchar(256)NULL、
NormalizedName nvarchar(256)NULL、
ConcurrencyStamp nvarchar(max)NULL、
CONSTRAINT PK_AspNetRoles主キー( Id
);

分析中に4つのエラーが見つかりました。

認識されないデータ型。 (39位の「nvarchar」の近く)
認識されないデータ型。 (75位の「nvarchar」の近く)
認識されないデータ型。 (117位の「nvarchar」の近く)
認識されないデータ型。 (位置161の「nvarchar」の近く)
SQLクエリ:

CREATE TABLE AspNetRolesId nvarchar(450)NOT NULL、 Name nvarchar(256)NULL、 NormalizedName nvarchar(256)NULL、 ConcurrencyStamp nvarchar(max)NULL、CONSTRAINT PK_AspNetRolesプライマリキー( Id ))

MySQLによると:ドキュメント

1064-SQL構文にエラーがあります。 'max)NULL付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)

) '5行目

さらなる技術的詳細

MySQLバージョン:5.7.22
オペレーティングシステム:Windows 10
Pomelo.EntityFrameworkCore.MySqlバージョン:3.0.0-rc1.final
Microsoft.AspNetCore.Appバージョン:3.0

closed-user-error

最も参考になるコメント

これは、(認証オプションを有効にして)新しいASP.NET Coreプロジェクトを作成し、EF CoreプロバイダーをPomelo.EntityFrameworkCore.MySqlに変更してから、移行または更新コマンドを実行した場合に発生する可能性があります。

問題は、VSがSQL Serverを使用することを想定していたため、最初の移行CreateIdentitySchemaをファイル.\Data\Migrations\00000000000000_CreateIdentitySchema.csUpを含む)にすでに追加していることです。 Down操作)および.\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (データベースに大きく依存するターゲットモデルを含む)。これらはSQLServerプロバイダーを使用して生成されました。

SQL Serverを使用している場合、これは確かに面倒な作業が1ステップ少なくなります。 ただし、他のデータベースプロバイダーを使用している場合は、誤った移行が含まれます。

SQL ServerではなくMySQLのみを使用している場合、これを修正する最も簡単な方法は、最初にUseMySql()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:

dotnetefの移行により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`)
);

全てのコメント4件

#863を再現しようとすると、内部で同じ移行クラスを使用するdotnet ef update databaseコマンドで同じエラーが発生します。 今これをチェックしています。

これは、(認証オプションを有効にして)新しいASP.NET Coreプロジェクトを作成し、EF CoreプロバイダーをPomelo.EntityFrameworkCore.MySqlに変更してから、移行または更新コマンドを実行した場合に発生する可能性があります。

問題は、VSがSQL Serverを使用することを想定していたため、最初の移行CreateIdentitySchemaをファイル.\Data\Migrations\00000000000000_CreateIdentitySchema.csUpを含む)にすでに追加していることです。 Down操作)および.\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (データベースに大きく依存するターゲットモデルを含む)。これらはSQLServerプロバイダーを使用して生成されました。

SQL Serverを使用している場合、これは確かに面倒な作業が1ステップ少なくなります。 ただし、他のデータベースプロバイダーを使用している場合は、誤った移行が含まれます。

SQL ServerではなくMySQLのみを使用している場合、これを修正する最も簡単な方法は、最初にUseMySql()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:

dotnetefの移行により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`)
);

これは、(認証オプションを有効にして)新しいASP.NET Coreプロジェクトを作成し、EF CoreプロバイダーをPomelo.EntityFrameworkCore.MySqlに変更してから、移行または更新コマンドを実行した場合に発生する可能性があります。

問題は、VSがSQL Serverを使用することを想定していたため、最初の移行CreateIdentitySchemaをファイル.\Data\Migrations\00000000000000_CreateIdentitySchema.csUpを含む)にすでに追加していることです。 Down操作)および.\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (データベースに大きく依存するターゲットモデルを含む)。これらはSQLServerプロバイダーを使用して生成されました。

Pomelo.EntityFrameworkCore.MySqlバージョン2.2では、CreateIdentitySchemaを削除および再作成しなくても機能します。

生成されたテーブル作成スクリプト

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;

エラーなしで、

3.0+が互換性と可用性のために同じように機能することを願っています。

この変更の理由はありますか?

ありがとう、

Pomelo.EntityFrameworkCore.MySqlバージョン2.2では、CreateIdentitySchemaを削除および再作成しなくても機能します。

Pomelo 2.2で変更なしで機能した場合、それはすばらしいことですが、構成(およびキーの種類)に大きく依存するため、一般化することはできません。

上記のように、新しいプロジェクトを作成するときに最初の移行を再生成して、有効な移行とモデル定義を確実に取得する必要があります。 そうでない場合は、自分で作成し、生成されたコードを少し調整して機能させる必要がある場合があります(これは、MySQLの知識によってはあまり労力をかけずに実行できます)。

3.0リリースにはいくつかの重大な変更があり(適切にタグ付けする必要があります)、メジャーまたはマイナーアップグレードの場合は、本番環境に移行する前に、開発環境とステージング環境で最初にコードをテストします。

エラーなしで、
[...]
この変更の理由はありますか?

3.0で具体的に話しているエラーと変更点は何ですか?

2.2.6から3.0.0に多くの変更が加えられたので、問題のあるモデルクラス、その定義、生成された移行、および結果のSQLスクリプトを自由に投稿してください。そうすれば、発生している問題について話し合うことができます。

このページは役に立ちましたか?
0 / 5 - 0 評価