【问题标题】:How to implement IDbContextFactory for use with Entity Framework data migrations如何实现 IDbContextFactory 以用于实体框架数据迁移
【发布时间】:2012-07-08 20:45:51
【问题描述】:

我正在尝试使用实体框架数据迁移,如this post 中所述。

但是,当我尝试执行 Enable-Migrations 步骤时,我在包管理器控制台中收到以下错误:

The target context 'MyDataContext' is not constructible. Add a default constructor or provide an implementation of IDbContextFactory

因此,我在包含我的 DbContext 类的项目中创建了一个实现 IDbContextFactory 的工厂类,但数据迁移似乎无法识别它。

我应该明确做些什么来指示数据迁移使用这个工厂类吗?

【问题讨论】:

    标签: entity-framework data-migration


    【解决方案1】:

    我在编写上下文以获取连接字符串名称(然后使用 ninject 提供它)时也遇到了这个问题。

    您所经历的过程似乎是正确的,如果有任何帮助,这里是我的课程实现的 sn-p:

    public class MigrationsContextFactory : IDbContextFactory<MyContext>
    {
        public MyContext Create()
        {
            return new MyDBContext("connectionStringName");
        }
    }
    

    这应该就是你所需要的。

    【讨论】:

    • 你把这门课放在哪里了?
    • 我建议将其放入包含您的“MyContext”类的程序集中。我通常会将这样的类保存在单独的程序集中,例如 MyApp.Data.Model 或 MyApp.Domain.Model,类似这些。
    • 能否提供 Ninject 配置代码?我不明白我将在哪里注入 connectionStringName,因为 Create 不采用构造函数参数。
    • EF如何知道工厂类——MigrationsContextFactory的存在。我们不是必须在某个地方注册它以便框架知道吗?有这个班级独立躺着自给自足吗?蒂姆似乎也承认这不是必需的!
    • 仅供参考 IDbContextFactory 现已过时。请改用IDesignTimeDbContextFactory
    【解决方案2】:

    就像@Soren 指出的那样,我们可以实现IDesignTimeDbContextFactory&lt;TContext&gt;,而不是使用一些早期的EF Core 版本(即EF Core 2.1)不支持的IDbContextFactory,它支持缺少的ConnectionString 参数。

    对于基于 settings.json 的方法,您可以将其与任何一个引用的接口一起使用,请查看@Arayn's sample,它允许我们定义“ConnectionStrings:DefaultConnection”价值路径

    更新 1

    根据@PaulWaldman 的评论,重新引入了对IDbContextFactoryEF Core 5 支持。有关更多详细信息,请查看下面的评论。

    【讨论】:

    • 最好将答案标记为重复,而不是仅仅链接到它。
    • 嗨@GertArnold。我不确定你的意思。您似乎在暗示我做错了什么(我可能),但我无法弄清楚。能详细点吗?
    • 您链接到现有的 SO 答案。通常最好将当前问题关闭(标记为)作为您链接到的答案的副本。
    • 其实我从来没有举报过,但从现在开始我会听取你的建议。但是,在这个特定的问题中,我不会,因为这两个问题都针对不同的 EF 接口。无论如何,谢谢你指出它
    • IDbContextFactory 不再过时。它在 EF Core 5 中重新引入。docs.microsoft.com/en-us/ef/core/dbcontext-configuration/…
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2014-07-08
    • 2015-05-11
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多