如何在引用程序集中的 DbContext 上触发更新数据库(NuGet 包)

Posted

技术标签:

【中文标题】如何在引用程序集中的 DbContext 上触发更新数据库(NuGet 包)【英文标题】:How to trigger Update-Database on a DbContext in a referenced assembly (NuGet package) 【发布时间】:2016-11-21 00:26:58 【问题描述】:

使用包管理器控制台,我可以运行类似于以下命令的命令

Update-Database -ProjectName: My.Project.Data

该命令触发在位于当前打开的解决方案中的项目 My.Project.Data 中定义的 MyDbContext 上的迁移。很好。

现在My.Project.Data 项目与My.Project.Mvc 项目位于同一个解决方案中。问题是,My.Project.Mvc 使用了两个数据库上下文。一个我们已经介绍过,另一个在项目Core.Project.Data 中定义——这个构建为 NuGet 包,然后由My.Project.Mvc 引用。下图应该清楚了:

MySolution
├┬ My.Project.Mvc
│├─ references: My.Project.Data (in the same solution)
│└─ references: Core.Project.Data (NuGet)
└─ My.Project.Data [MyDbContext]

CoreSolution
└─ Core.Project.Data [CoreDbContext]

问题是,如何从MySolution 的包管理器控制台触发CoreDbContext 的迁移。如果我尝试运行 Update-Database -ProjectName: Core.Project.Data 我会收到错误:

Get-Project : Project 'Core.Project.Data' is not found.

更新:不能选择使用 migrate.exe。

【问题讨论】:

您的 Nuget 包可能有问题吗? github.com/NuGet/NuGetGallery/issues/2884 @SteveGreene,感谢链接。但是我尝试重新启动 PC,清理解决方案,重建解决方案......这些都没有帮助 【参考方案1】:

从document更新数据库不支持dll。

您可以从命令行执行 EF 迁移工具,也可以将其添加到 VS 菜单中以方便使用。

migrate.exe Core.Project.Data.dll /startupConfigurationFile=Core.Project.Data.dll.config

或将/startupConfigurationFile 更改为/connectionString=your-connection-string

【讨论】:

谢谢,这很好 (+1),但是我知道 migrate.exe 并且我正在寻找一种方法来避免它。更新数据库更方便。【参考方案2】:

Enable-Migration 首次启用迁移时,Configuration.cs 文件将添加到项目中。如果 Core.Project.Data 存在此文件,请告诉 Entity Framework 使用此配置:

Update-Database -ConfigurationTypeName Core.Project.Data.Migrations.Configuration -ProjectName Core.Project.Data

【讨论】:

我猜你的意思是ConfigurationTypeName(不是Configuration)选项,对吧?不幸的是,它无论如何都无济于事,因为该命令试图在当前程序集中找到给定的类型... 即使你将它与-ProjectName 结合起来指向另一个程序集?我编辑了我的答案... 是的,当然,我已经尝试指定-ProjectName,但在这种情况下,我遇到了问题中描述的错误消息。指定-ConfigurationTypeName 很好,但首先您需要能够找到该项目。这就是 Update-Database 命令失败的原因。 不再工作(我正在使用 VS 2019 和 .NET Core 2.2):更新数据库:找不到与参数名称“ConfigurationTypeName”匹配的参数。 对于新的 .NET Core 工具 update-database 命令,我们应该使用 -context 参数,但它仍然不起作用,因为它试图在当前程序集中而不是在引用的那个。

以上是关于如何在引用程序集中的 DbContext 上触发更新数据库(NuGet 包)的主要内容,如果未能解决你的问题,请参考以下文章

EF4 DbContext:如何集中审核数据库读取

如何在 T4 模板中使用 DbContext?

如何在引用的程序集中查找派生类型?

服务引用 - 为啥在引用的程序集中重用类型

将 DbContext 与依赖注入一起使用

在构建我的 c# 项目时,出现“在未引用的程序集中定义”错误,如何解决?