我有一个只有一个类库的项目。我现在正在尝试在类库中生成迁移。
她是我的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包。这就是为什么我只有一个类库。
答案 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的项目?