以前我就曾经遇到过这样的问题。先上提示!

An unhandled exception occurred while processing the request.
MySqlException: Incorrect string value: '\xE6\x9E\x81\xE5\x94\xAE' for column 'WebsiteName' at row 1
MySqlConnector.Core.ServerSession.TryAsyncContinuation(Task<ArraySegment<byte>> task) in ServerSession.cs, line 1252
MySqlException: Incorrect string value: '\xE6\x9E\x81\xE5\x94\xAE' for column 'WebsiteName' at row 1
MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet) in MySqlDataReader.cs, line 81
DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)

 

错误原因:由于第三方Connecter 在初始化数据库时,特别是使用命令行(Update-Database)直接创建数据库时!connecter不会把数据库设置为utf8 mb4格式。众所周知,Mysql的utf8是假utf8,实际上只有utf8mb4才是四位可以放中文的。

 

一般解决办法可以通过指令或者是Navicat工具将数据库修改。

 

但是为了让我的代码可以自动迁移,不需要提前用工具远程迁移,即使是在一个没有我技术支持的服务器上,我在 Program Main()函数中调用了迁移,这样代码在运行时就会自动检测是否需要初始化迁移!

        public static void Main(string[] args)
        {
            host = CreateWebHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    var context = services.GetRequiredService<ProxyCardWebSystemContext>();
                    var usermanage = services.GetService<UserManager<ProxyCardWebSystemUser>>();
                    var rolemanage = services.GetService<RoleManager<IdentityRole>>();
                    context.Database.Migrate(); //迁移代码
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }

            host.Run();
        }

就是因为这样所以我希望,我也不需要为手动数据库设置utf8mb4。

所以可以在迁移文件(Migrations文件夹中)找到第一个迁移文件。加上一行代码

    public partial class InitMysql : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {

            migrationBuilder.Sql([email protected]"ALTER DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"); //加入这行代码即可!

            migrationBuilder.CreateTable(
                name: "AspNetRoles",
                columns: table => new

 

 

评论

想当第一个评论家吗?

提交评论