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

时间:2019-02-27 05:55:41

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

我正在开发 Xamarin.Forms 应用程序,并使用EF 6定位 .net标准2.0 。该应用程序通过我的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(),但是,我得到了< strong> SQLite错误1:表“用户”已存在。有什么帮助吗?生产中的代码已经具有 Database.EnsureCreated(),但是现在我不得不迁移和更新数据库,但是它无法正常工作,并且我总是得到 表已经存在 错误。

1 个答案:

答案 0 :(得分:0)

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

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