EF Core:如何为Linux配置mySql和为Windows配置localDB?

时间:2018-11-28 01:39:19

标签: c# asp.net-core entity-framework-core

我有一个使用LocalDB的简单ASP.Net Core / Entity Framework Core项目。它可以在Windows上编译并正常运行。

我想在Windows和Linux上构建并运行相同的项目。但是Linux不支持LocalDB。因此,我需要将项目配置为改为使用mySql-但仅适用于Linux。

问:如何配置项目,以便可以在Windows上使用LocalDB,而在Linux上使用mySql?

这是我到目前为止尝试过的:

  1. 创建了一个空的mySql数据库,并授予了对mySql用户的访问权限。

  2. appsettings.json中创建了mySql连接字符串:

    {
      "ConnectionStrings": {
      "DefaultConnection": "Server=(LocalDb)\\MSSQLLocalDB;Database=ManageCarDB;Trusted_Connection=True;MultipleActiveResultSets=true",
      "mySqlConnection": "Server=localhost;port=3306;database=ManageCarDb;uid=dotnetuser;password=dotnetuser"
    },...
    <= I've defined two different connection strings: one for LocalDB, one for MySql
    
  3. 已更新Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        string env = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        string connectionString;
        if (!string.IsNullOrEmpty(env) && env.Equals("Linux"))
        {
           connectionString = Configuration.GetConnectionString("mySqlConnection");
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseMySQL(connectionString));
        }
        else
        {
            connectionString = Configuration.GetConnectionString("DefaultConnection");
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(connectionString));
        }
    

    <=启动将有条件地调用MySql连接字符串/ MySQL数据提供程序或default / LocalDB

  4. 在Linux上:

    1. 删除所有二进制文件
    2. dotnet restore
    3. dotnet ef migrations add newMigration -c ApplicationDbContext -v

    <=一切正常

  5. 试图更新数据库:

    dotnet ef database update

    <= 错误:表'ManageCarDb .__ EFMigrationsHistory'不存在

问:鉴于我想要针对两个EF环境的一个项目,我是否采取了正确的步骤?

还是应该采用其他方法?

1 个答案:

答案 0 :(得分:2)

您应该使用`Pomelo.EntityFrameworkCore.MySql而不是Oracle的MySql库。

我使用Pomelo.EntityFrameworkCore.MySql,它在我的项目中效果很好。

Oracle的MySql库不像我尝试的那样支持迁移。该库面临几个问题

注意:我正在为Oracle网站找到一个讨论此问题的链接

Error: The method or operation is not implemented. while scaffolding MYSQL Database

https://bugs.mysql.com/bug.php?id=90368