Как использовать Database.Migration () после Database.EnsureCreated () EF Xamarin.Forms - PullRequest
0 голосов
/ 27 февраля 2019

Я работал над приложением 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}");    
    }
}

Теперь мне нужно добавить новый столбец в таблицу User .Для этого я создал консольное приложение .net и сгенерировал папку миграции, используя следующие команды.

dotnet ef migrations add Initial
dotnet ef update database

Затем я скопировал сгенерированную папку миграции в мой проект dbContext и изменил Database.EnsureCreated () до Database.Migration () Но я получаю Ошибка SQLite 1: Таблица «Пользователь» уже существует .Любая помощь?Код уже в производстве, имеющий Database.EnsureCreated () , но теперь мне нужно перенести и обновить базу данных, но она не работает, и всегда я получаю таблицу, уже существующую ошибка.

1 Ответ

0 голосов
/ 28 февраля 2019

Вот более безопасный подход по сравнению с моим предыдущим комментарием

  1. add-migration Initial для моделей, эквивалентных производственной базе данных (т. Е. без недавно добавленного столбца в User таблица и другие изменения, которые вы сделали после развертывания в рабочей среде).
  2. Обновите производственную базу данных __EFMigrationsHistory вручную, включив в нее миграцию Initial.
  3. add-migration XXX для обновленной схемы (т. е. новые столбцы и т. д.).
  4. XXX следует затем применить к производственной базе данных методом Database.EnsureMigrate().
...