将迁移添加到我的类库ef核心

时间:2020-02-12 13:01:18

标签: c# .net-core entity-framework-core

我有一个只有一个类库的项目。我现在正在尝试在类库中生成迁移。

她是我的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 个答案:

答案 0 :(得分:2)

我认为最好的解决方案是使用Startup.cs创建一个测试项目。在配置服务的何处注册DbContext并使用此项目来管理迁移。

要指定应在何处添加迁移,可以将此选项添加到DbContext选项中:


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

其中MyLib.Migrations-用于存储迁移的程序集的名称

答案 1 :(得分:0)

您是否在程序包管理器控制台中运行命令(dotnet ef迁移添加InitialCreate --project SecurityAttribute)?如果是这样,您是否在包管理器控制台下拉菜单中正确设置了默认项目?该解决方案的启动项目是否设置为带有Startup.cs的项目?