如何实现 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<TContext>
,而不是使用一些早期的EF Core 版本(即EF Core 2.1)不支持的IDbContextFactory
,它支持缺少的ConnectionString 参数。
对于基于 settings.json 的方法,您可以将其与任何一个引用的接口一起使用,请查看@Arayn's sample,它允许我们定义“ConnectionStrings:DefaultConnection”价值路径
更新 1
根据@PaulWaldman 的评论,重新引入了对IDbContextFactory
的EF Core 5 支持。有关更多详细信息,请查看下面的评论。
【讨论】:
最好将答案标记为重复,而不是仅仅链接到它。 嗨@GertArnold。我不确定你的意思。您似乎在暗示我做错了什么(我可能),但我无法弄清楚。能详细点吗? 您链接到现有的 SO 答案。通常最好将当前问题关闭(标记为)作为您链接到的答案的副本。 其实我从来没有举报过,但从现在开始我会听取你的建议。但是,在这个特定的问题中,我不会,因为这两个问题都针对不同的 EF 接口。无论如何,谢谢你指出它 IDbContextFactory 不再过时。它在 EF Core 5 中重新引入。docs.microsoft.com/en-us/ef/core/dbcontext-configuration/…以上是关于如何实现 IDbContextFactory 以用于实体框架数据迁移的主要内容,如果未能解决你的问题,请参考以下文章
Blazor 服务器应用程序和 IDbContextFactory 未处理
如何批量更新 MongoDB 字符串数组以用连字符替换空格?
Swift 5.5 并发:如何序列化异步任务以用 maxConcurrentOperationCount = 1 替换 OperationQueue?