首页 > 解决方案 > 如何在 Database.EnsureCreated() EF Xamarin.Forms 之后使用 Database.Migration()

问题描述

我正在开发Xamarin.Forms应用程序并使用针对.net standard 2.0的EF 6 。该应用程序与我的 DBContext 类一起在应用商店中运行,如下所示。

public class DatabaseContext : DbContext
{
    private readonly string _databasePath;

    // Hotworks related tables
    public DbSet<User> User { get; set; }
    public DbSet<UserProfile> UserProfile { get; set; }

    public DatabaseContext(string databasePath)
    {
        _databasePath = databasePath;
        Database.EnsureCreated();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite($"Filename={_databasePath}");    
    }
}

现在,我必须在用户表中添加一个新列。为此,我创建了一个.net 核心控制台应用程序并使用以下命令生成了迁移文件夹。

dotnet ef migrations add Initial
dotnet ef update database

然后,我将生成的 Migration 文件夹复制到我的 dbContext 项目并将Database.EnsureCreated()更改为Database.Migration()但是,我收到SQLite 错误 1: Table "User" already exists。有什么帮助吗?代码已经在生产中具有Database.EnsureCreated()但现在我必须迁移和更新数据库,但是它不工作并且总是我得到表已经存在错误。

标签: c#xamarin.formsxamarin.androidentity-framework-6entity-framework-core

解决方案


与我之前的评论相比,这是一种更安全的方法

  1. add-migration Initial对于与生产数据库等效的模型(即没有表中新添加的列User以及您在部署到生产后所做的其他更改)。
  2. 手动更新生产数据库__EFMigrationsHistory以包含Initial迁移。
  3. add-migration XXX对于更新的架构(即新列等)。
  4. XXX然后应该通过该Database.EnsureMigrate()方法应用于您的生产数据库。

推荐阅读