IDesignTimeDbContextFactory是否总是需要?

4

以前我必须实现IDesignTimeDbContextFactory才能运行迁移,例如: PM > Add-Migration Initial PM > Update-Database

如果没有这样做,控制台会抛出错误并将我带到这里:https://learn.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext#use-idesigntimedbcontextfactory.

所以我按照建议去做,并成功运行了迁移。 之后我创建了新项目,但不需要实现IDesignTimeDbContextFactory也可以正常运行迁移。这是怎么可能的呢? 所有项目都使用相同的.NET Core版本(2.0)。

我们是否总是需要创建一个IDesignTimeDbContextFactory,还是只在某些情况下需要?

谢谢!


这是否适用?https://www.bountysource.com/issues/46781053-ef-core-2-0-design-time-dbcontext-discovery-changes - Bradley Uffner
可能是谢谢,我在 GitHub 上找到了讨论,所以我也会在那里发布问题,并在得到回复后回来。 - Jan Banan
2个回答

4
如果您的DbContext中有一个默认构造函数,或者正在使用ASP.NET Core 2.0项目模板中建立的Program.BuildWebHost()模式,通常不需要IDesignTimeDbContextFactory实现。在2.0.0-preview1中,未使用Program.BuildWebHost(),因此需要设计时工厂。请参见此线程以获取完整讨论:https://github.com/aspnet/EntityFrameworkCore/issues/9033

1
正如Dan Banan所述,如果一个DbContext有一个默认构造函数,在设计时它就不需要一个IDesignTimeDbContextFactory。然而,如果它需要从Startup进行配置,它将需要一个接受DbContextOptions<T>并调用相应base构造函数的构造函数。然而,这将创建另一个问题。无论使用哪个构造函数,DbContextOnConfigure方法都将被调用。
为了考虑到这些细节,我发现以下模式很有用: DbContext配置和依赖注入
serviceCollection
    .AddDbContext<MyDbContext>(
        options => options.UseSqlServer(configuration.GetConnectionString("MyDb"),
        ServiceLifetime.Transient
    );

MyDbContext.cs

public class MyDbContext : DbContext
{
    public SureshotDbContext()
    {
        // This allows for instantiation at design time.
    }

    public MyDbContext(DbContextOptions<MyDbContext> options) :
        base(options)
    {
        // This allows for configuration in real applications.
    }

    protected override void OnConfiguring(
        DbContextOptionsBuilder optionsBuilder
    )
    {
        if (optionsBuilder.IsConfigured)
        {
            return;
        }

        optionsBuilder.UseSqlServer(nameof(TDbContext));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接