我正在开发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()但是,我得到了SQLite错误1:表“用户”已经存在。有什么帮助吗?生产中的代码已经具有Database.EnsureCreated(),但是现在我必须迁移和更新数据库,但是它无法正常工作,并且总是让我得到表已存在的错误。

最佳答案

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


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

10-08 06:36