Миграция EF Core с базой данных SQLite: невозможно создать объект типа - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь выполнить первоначальную миграцию базы данных SQLite с помощью Entity Framework Core.

Мое решение состоит из двух проектов: консольного приложения и библиотеки классов (которая содержит DbContext и все модели).

DbContext выглядит так:

public class SQLite_DbContext : DbContext
{
    public DbSet<DeviceRepresentation> Devices { get; set; }
    public DbSet<FileInfoDatabaseRepresentation> Files { get; set; }

    public SQLite_DbContext(DbContextOptions<SQLite_DbContext> options)
        : base(options)
    {
    }
}

Находясь в библиотеке классов (где я храню свой DbContext), я пытаюсь создать миграцию:

dotnet ef migrations add InitialCreate

В результатеdotnet cli возвращает ошибку:

Невозможно создать объект типа 'SQLite_DbContext'. Для различных шаблонов, поддерживаемых во время разработки, см. https://go.microsoft.com/fwlink/?linkid=851728

Вы можете увидеть, что может быть проблемой здесь?

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Я, наверное, нашел решение. Есть хорошее объяснение того, что происходит скрытно при создании миграций в документах [здесь] .

В моем случае, согласно документации, EF Core Tools пытаются создать экземпляр SQLite_DbContext, не передавая параметров конструктору. Такого конструктора не было в моем коде, потому что только один принимает один параметр (options). Это причина, по которой он "не смог создать объект". Когда я удалил свой пользовательский конструктор из кода, он начал правильно генерировать миграции.

В качестве альтернативы, как я вижу, есть также возможность взять под контроль то, как создается DbContext. Существует возможность создать «фабрику», которую инструменты EF будут использовать для создания экземпляра этого класса:

public class SQLite_DbContextFactory : IDesignTimeDbContextFactory<SQLite_DbContext>
    {
        public SQLite_DbContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<SQLite_DbContext>();
            optionsBuilder.UseSqlite("Data Source=blog.db");

            return new SQLite_DbContext(optionsBuilder.Options);
        }
    }
1 голос
/ 07 октября 2019

Если я хорошо помню, SQLite не поддерживает миграции. Вы можете следить за этим постом, если обходной путь может соответствовать вашим потребностям https://medium.com/@hoekje/simple-migrations-with-c-and-sqlite-9942e1863536

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...