Добавить миграцию в мою библиотеку классов ef core - PullRequest
1 голос
/ 12 февраля 2020

У меня есть проект только с одной библиотекой классов. Я сейчас пытаюсь сгенерировать миграцию в библиотеке классов.

Вот мой DbContext:

public class DatabaseContext : DbContext, IDatabaseContext
{
    public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options) 
    { }

    public DbSet<Security> Services { get; set; }
    public DatabaseFacade DatabaseAccessor => this.Database;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.EnableSensitiveDataLogging();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("dbo");

        modelBuilder.Entity<Security>().HasNoKey();

        base.OnModelCreating(modelBuilder);
    }
}

Когда я запускаю команду

dotnet ef migrations add InitialCreate --project SecurityAttribute

Я получаю следующую ошибку:

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

Мой IServiceCollections выглядит следующим образом:

public static IServiceCollection AddServiceAndRoleSecurity(this IServiceCollection services)
{
    services.AddTransient<ISecurityService, SecurityService>();
    services.AddMemoryCache();

    services.AddTransient<ISecurityRepository, SecurityRepository>();
    services.AddDbContext<IDatabaseContext, DatabaseContext>(options => options.UseSqlServer(
                 @"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=SecurityAttribute;Integrated Security=SSPI;",
                sqlServerOptions => sqlServerOptions.CommandTimeout(10 * 60)
             ));
    services.AddTransient<IDatabaseContextFactory, DatabaseContextFactory>();
    return services;
}

public static IHost CreateDatabase(this IHost host)
{
    using (var scope = host.Services.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<IDatabaseContext>();
        var migrations = db.DatabaseAccessor.GetPendingMigrations();

        if (migrations.Any())
            db.DatabaseAccessor.Migrate();
    }
    return host;
}

Моя библиотека классов будет используется как пакет nuget. Вот почему у меня есть только библиотека классов.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Я думаю, что лучшее решение - создать тестовый проект с помощью Startup.cs. Где в настройках сервисов вы регистрируете свой DbContext и используете этот проект для управления миграциями.

Чтобы указать, куда должны быть добавлены миграции, вы можете добавить эту опцию в DbContext опции:


options.UseSqlServer(
    connectionString,
    x => x.MigrationsAssembly("MyLib.Migrations"));

где MyLib.Migrations - имя сборки, в которой будут храниться миграции

0 голосов
/ 12 февраля 2020

Запускаете ли вы вашу команду (выполните tnet, если при миграции добавьте InitialCreate --project SecurityAttribute) в консоли диспетчера пакетов? Если да, то есть ли у вас правильно установлен проект по умолчанию в консоли диспетчера пакетов? Запущен ли проект запуска для решения с Startup.cs?

...