如何实现 IDbContextFactory 以用于实体框架数据迁移

Posted

技术标签:

【中文标题】如何实现 IDbContextFactory 以用于实体框架数据迁移【英文标题】:How to implement IDbContextFactory for use with Entity Framework data migrations 【发布时间】: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 的工厂类,但数据迁移似乎无法识别它。

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

【问题讨论】:

【参考方案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/…

以上是关于如何实现 IDbContextFactory 以用于实体框架数据迁移的主要内容,如果未能解决你的问题,请参考以下文章

Blazor 服务器应用程序和 IDbContextFactory 未处理

如何优化 spark 函数以用零替换空值?

如何批量更新 MongoDB 字符串数组以用连字符替换空格?

Swift 5.5 并发:如何序列化异步任务以用 maxConcurrentOperationCount = 1 替换 OperationQueue?

[方法总结] 如何入门一个新领域/新技术?——「以用促学知识树学习法」

在 PHP 中编写正则表达式以用 <a> 包装 <img> [重复]