c# - 如何在 Database.EnsureCreated() EF Xamarin.Forms 之后使用 Database.Migration()

标签 c# xamarin.forms xamarin.android entity-framework-6 entity-framework-core

我当时正在开发一个 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}");    
    }
}

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

dotnet ef migrations add Initial
dotnet ef update database

然后,我将生成的 Migration 文件夹复制到我的 dbContext 项目并将 Database.EnsureCreated() 更改为 Database.Migration() 但是,我得到了 < strong>SQLite 错误 1:表“用户”已存在。有什么帮助吗?生产中的代码已经有 Database.EnsureCreated() 但现在我必须迁移和更新数据库,但它不起作用,而且我总是得到 表已经存在 错误。

最佳答案

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

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

关于c# - 如何在 Database.EnsureCreated() EF Xamarin.Forms 之后使用 Database.Migration(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54898927/

相关文章:

c# - ASP.NET Mvc - System.Web.Compilation.CompilationLock

c# - 将匿名委托(delegate)与 .NET ThreadPool.QueueUserWorkItem 结合使用

c# - 如何在编写和读取xml时检测段落并在页面上正确显示?

c# - Xamarin Forms - 实现嵌套列表

c# - Xamarin Forms - 更改图像源时触发代码

java - Java 中的 C# InvalidEnumArgumentException

xamarin - 在 Android 上,应用程序在方向更改时跳回默认页面

android - MvvmCross:Android应用程序属性

c# - 升级 Xamarin 表单后按钮无法立即呈现

c# - 将按钮缩放到文本 Xamarin Forms