添加迁移:无法创建 AppContext 类型的对象

时间:2020-12-29 10:27:38

标签: c# dependency-injection entity-framework-core .net-5

我有一个 .NET 5 解决方案,其中包含两个项目(DataLayer 和 ServiceLayer)。 在 DataLayer 中,我有以下 DbContext:

internal class ApplicationContext
    : DbContext
{
    public ApplicationContext(DbContextOptions<ApplicationContext> options)
        : base(options)
    {
    }
    public virtual DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);
    }
}

以及以下 DbContextFactory:

internal sealed class ContextFactory
    : IDbContextFactory<ApplicationContext>
{
    public ContextFactory(DbContextOptions<ApplicationContext> options)
    {
        Options = options ?? throw new ArgumentNullException(nameof(options));
    }

    private DbContextOptions<ApplicationContext> Options { get; }

    public ApplicationContext CreateDbContext()
    {
        return new ApplicationContext(Options);
    }
}

我在每个存储库构造器中使用的:

 public UserRepository(IDbContextFactory<ApplicationContext> contextFactory) { ... }

以及 DbContextFactory 的服务初始化:

services.AddDbContextFactory<ApplicationContext>(options =>
{
    options
    .UseLazyLoadingProxies()
    .UseSqlServer(connectionString);
});

问题是当我尝试创建迁移时,我收到以下消息:

<块引用>

无法创建类型为“ApplicationContext”的对象。有关设计时支持的不同模式,请参阅 https://go.microsoft.com/fwlink/?linkid=851728 以了解这两个命令:

添加迁移初始

dotnet ef 迁移添加初始 --project DataLayer

我还不得不提到,这两个项目都是普通的 .NET 5 库项目,在服务层项目中,我手动构建了 ServiceCollection:var services = new ServiceCollection();

我搜索了解决方案,但没有找到。

谢谢

1 个答案:

答案 0 :(得分:2)

我认为你不能在构造函数中注入任何东西。您应该使用 documentation 中描述的方式:

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

        return new BloggingContext(optionsBuilder.Options);
    }
}

然后你可以通过args传递任何参数:

dotnet ef database update -- --environment Production --connectionstring "some_connection_string"