Sqlite Forms and EntityFrameworkCore 3.x如何正确创建数据库并应用迁移?

Sqlite Forms and EntityFrameworkCore 3.x如何正确创建数据库并应用迁移?,sqlite,xamarin.forms,entity-framework-core,entity-framework-migrations,Sqlite,Xamarin.forms,Entity Framework Core,Entity Framework Migrations,使用Xamarin.Forms和EntityFrameworkCore在Android/iOS设备上创建EF Core数据库的正确方法是什么 我遇到了重新创建vsMigrate的问题,由于我计划在将来更改数据库结构,我希望能够将这些迁移应用到现有数据库,因此我选择了迁移方法 但是,当我调用Migrate方法时,它似乎没有创建数据库。我已经设法让它工作起来,以防我事先在设备上复制预生成的数据库文件,但这不是我想要的。有没有办法让EF Core检查是否存在现有数据库,如果没有,则创建一个新数据库,然

使用Xamarin.Forms和EntityFrameworkCore在Android/iOS设备上创建EF Core数据库的正确方法是什么

我遇到了重新创建vs
Migrate
的问题,由于我计划在将来更改数据库结构,我希望能够将这些迁移应用到现有数据库,因此我选择了迁移方法

但是,当我调用
Migrate
方法时,它似乎没有创建数据库。我已经设法让它工作起来,以防我事先在设备上复制预生成的数据库文件,但这不是我想要的。有没有办法让EF Core检查是否存在现有数据库,如果没有,则创建一个新数据库,然后对其应用挂起的迁移

以下是我迄今为止所做的工作:

  • 我创建了一个.net标准类库“Data”,它将保存我的所有数据库类(上下文、模型和迁移)
  • 我已经将“数据”项目的TargetFramework从
    netstandard2.0
    更改为
    netcoreapp2.0;netstandard2.0
    这样我就可以在上面运行PMC命令了
  • 我已将这些nuget软件包安装到“Data”项目中:
    • EntityFrameworkCore
    • EntityFrameworkCore.Sqlite
    • EntityFrameworkCore.Tools
    • EntityFrameworkCore.设计
  • 我已经创建了一个数据库上下文类。我为它做了两个构造器。默认值仅由PMC命令用于生成迁移。另一个将用于生产
  • 公共类MyTestContext:DbContext { 私有字符串\u数据库路径; 公共数据库集问题{get;set;} [过时(“不要将其用于生产。这仅用于创建迁移。”)] public MyTestContext():这个(“nothing.db”) { } 公共MyTestContext(字符串数据库路径) { _databasePath=数据库路径; } 配置时受保护的覆盖无效(DBContextOptions Builder Options Builder) { //我也在这里尝试了Filename={{u databasePath},但也不起作用 optionsBuilder.UseSqlite($“数据源={u数据库路径}”); } }
  • 我创建了一个测试模型类,只是为了玩一些东西
  • 公共类问题
    {
    公共字符串Id{get;set;}
    }
    
  • 我使用此命令创建了初始迁移,该迁移已成功完成:
  • 我在Xamarin.Forms项目的App.xaml.cs中添加了对
    Migrate
    方法的调用,以测试它是否有效
  • 公共部分类应用程序:应用程序{
    //…其他代码
    受保护的重写异步void OnStart()
    {
    base.OnStart();
    使用(var db=newmytestcontext(_dbPath))
    {
    尝试
    {
    db.Database.Migrate();
    db.Issues.Add(新问题
    {
    Id=“TestIssueId”
    });
    db.SaveChanges();
    }
    捕获(例外情况除外)
    {
    Debug.WriteLine(ex);
    }
    }
    }
    //…其他代码
    }
    
    \u dbPath
    变量包含以下内容(在我测试它的Android上):

    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),“test.db”);
    
    在这一切之后,我得到了一个例外:

    Microsoft.Data.Sqlite.SqliteException: SQLite Error 1: 'no such table: Issues'.
    

    总之,您的目标是自动将迁移应用到sql数据库和sqlite数据库?@Adlorem是的,没错。sql和sqlite有不同的模式。例如sqllite没有datetime的存储类型。这不是你能在开箱即用的东西。此外,还有一个问题是如何从代码中处理更新的数据库架构。归根结底,您的目标是自动将迁移应用到sql数据库和sqlite数据库?@Adlorem是的,没错。sql和sqlite有不同的架构。例如sqllite没有datetime的存储类型。这不是你能在开箱即用的东西。此外,还有一个问题是如何从代码中处理更新的数据库模式。
    Microsoft.Data.Sqlite.SqliteException: SQLite Error 1: 'no such table: Issues'.