EF Core迁移到Azure MariaDB数据库失败

时间:2019-01-20 09:30:15

标签: mysql azure .net-core visual-studio-2017 mariadb

我试图为.NET Core控制台应用程序和Azure MariaDB创建简单的示例,但是我做什么并不重要。我仍然遇到一个同样的例外。

复制步骤

  1. 在Azure上创建MariaDB-Azure MariaDB Tutorial
  2. 通过Visual Studio 2017创建控制台应用(.NET Core)
  3. 下载NuGet软件包-Pomelo.EntityFrameworkCore.MySql
  4. 创建简单的代码进行测试

程序代码

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var context = new BloggingContext();

            context.Blogs.Add(new Blog
            {
                BlogId = 0,
                Posts = new List<Post>
                {
                    new Post
                    {
                        BlogId = 5,
                        Title = "Some Title"
                    }
                },
                Url = "Some Url"
            });

            context.SaveChanges();
        }
    }
}

数据库上下文代码

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace ConsoleApp1
{
    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySql("Database=azure-database; Data Source=azure-database.mariadb.database.azure.com; User Id=azure_user@azure-database; Password=azure-password");
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }

        public ICollection<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
}
  1. 通过Visual Studio 2017中的Package Manager控制台创建迁移(添加迁移初始值)
  2. 通过Visual Studio 2017中的程序包管理器控制台在Azure上更新数据库(Update-Database)

问题

迁移失败且失败。

Exception message: Failed to read the result set.
Stack trace:
MySql.Data.MySqlClient.MySqlException (0x80004005): Failed to read the result set. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at MySqlConnector.Protocol.Serialization.ByteArrayReader.ReadLengthEncodedInteger() in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ByteArrayReader.cs:line 124
   at MySqlConnector.Protocol.Serialization.ByteArrayReader.ReadLengthEncodedByteString() in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ByteArrayReader.cs:line 155
   at MySqlConnector.Protocol.Payloads.OkPayload.Create(ReadOnlySpan`1 span, Boolean deprecateEof) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Payloads\OkPayload.cs:line 47
   at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 47
   at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 80
   at MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 302
   at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(MySqlCommand command, CommandBehavior behavior, ResultSetProtocol resultSetProtocol, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 287
   at MySqlConnector.Core.TextCommandExecutor.ExecuteReaderAsync(String commandText, MySqlParameterCollection parameterCollection, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\TextCommandExecutor.cs:line 37
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 261
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 62
   at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlDatabaseCreator.<>c__DisplayClass18_0.<Exists>b__0(DateTime giveUp)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.<>c__DisplayClass12_0`2.<Execute>b__0(DbContext c, TState s)
   at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, Func`2 operation, Func`2 verifySucceeded, TState state)
   at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

更多技术细节

  • MariaDB版本:10.2.17
  • Pomelo.EntityFrameworkCore.MySql版本:2.1.4
  • Microsoft.NETCore.App版本:2.2.0

其他信息 当我使用官方MySQL库进行尝试时,一切正常。

0 个答案:

没有答案