无法在运行时设置 DbContext 连接字符串并将项目与应用程序分开的情况下运行 EF 迁移

Posted

技术标签:

【中文标题】无法在运行时设置 DbContext 连接字符串并将项目与应用程序分开的情况下运行 EF 迁移【英文标题】:Can't run EF migration where DbContext connection string is set at runtime and separate project from application 【发布时间】:2017-02-14 11:29:33 【问题描述】:

我有一个类库项目,其中有一个 DbContext 类,如下所示:

public DbContext() : base(ContextInitializer.GetConnectionStringName())
    

这样用户(其他程序员)可以在他们的应用程序启动时设置这个,当他们可以在他们在任何项目中选择的任何数据库上使用我的 API 和实体时,然后设置连接字符串。现在我正在尝试在我的类库中生成迁移配置。我试过了:

Enable-Migrations -ProjectName "ClassLibraryProject" -ContextTypeName "MyDbContext" -StartUpProjectName "MyWebApp" -ConnectionString "MyConnectionString" -ConnectionProviderName "System.Data.SqlClient"

基于此处遇到相同错误的其他答案,但无济于事。我仍然得到:

使用“2”参数调用“SetData”的异常:“在程序集中键入“Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject” 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 未标记为可序列化。” 在 C:\Users\me.nuget\packages\EntityFramework\6.1.3\tools\EntityFramework.psm1:718 char:5 + $domain.SetData('project', $project) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : 序列化异常

使用“2”个参数调用“SetData”的异常:“类型 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' 在程序集'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, 版本=14.1.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' 是 未标记为可序列化。”在 C:\Users\me.nuget\packages\EntityFramework\6.1.3\tools\EntityFramework.psm1:719 字符:5 + $domain.SetData('contextProject', $contextProject) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : 序列化异常

使用“2”个参数调用“SetData”的异常:“类型 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' 在程序集'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, 版本=14.1.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' 是 未标记为可序列化。”在 C:\Users\me.nuget\packages\EntityFramework\6.1.3\tools\EntityFramework.psm1:720 字符:5 + $domain.SetData('startUpProject', $startUpProject) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : 序列化异常

我在这里看到的其他答案说使用 -StartUpProjectName 参数,我这样做了,但仍然得到错误。我认为这是因为我的项目位于我正在使用的解决方案中的嵌套文件夹中,但是将项目名称提供为“路径/项目名称”会触发一个错误,即找不到项目,所以不可能。

编辑:我发现了这个:EF 6 with a dnx project,我的项目是面向 461 运行时的 Asp.NET Core 类库,并在 Asp.NET Core Web 应用程序中使用。所以没有办法在使用 EF 6 和 ASP.NET Core 的类库中运行迁移?

【问题讨论】:

【参考方案1】:

好的,所以看了很多之后,默认情况下你不能这样做。自 1 月以来,类库完全没有任何工具,这对我来说似乎很可怕。并且没有工具作为我发布的链接提到使用 EF6 针对 461 的 .NET CORE 类库,因为 EF6 工具无法识别 project.json 依赖格式。

不过,幸运的是,一位名叫 Mohammad Rahhal 的绅士创建了这样一个库来完成此任务:https://github.com/mrahhal/Migrator.EF6/blob/master/README.md

并使用本期中描述的信息:https://github.com/mrahhal/Migrator.EF6/issues/9

我能够成功运行迁移,它确实需要一些 hacky 的东西,但它暂时有效,比其他地方提供的其他替代方案更好。

1) 为 Migrator.EF6.Tools nuget 下载此 nuget 包。

2) 更改 project.json 以包含:


  "version": "1.0.0-*",

  "dependencies": 
    "EntityFramework": "6.1.3",
    "Migrator.EF6.Tools": "1.0.5"
  ,

  "frameworks": 
    "net461": 
  ,

  "buildOptions": 
    "emitEntryPoint": true
  ,

  "tools": 
    "Migrator.EF6.Tools": 
      "imports": "portable-net45+win8+dnxcore50",
      "version": "1.0.5"
    
  

3) 将带有 Main stub 的 program.cs 文件添加到类库项目中:

public class Program

    public static void Main(string[] args)
    
    

您现在已设置为从 VS2015 开发命令提示符运行迁移。导航到项目目录,然后运行上面链接的自述文件中描述的迁移命令。

但是,应该注意的是,一旦你完成了迁移的运行,再次将emitEntryPoint 的值设置为 false,这样它仍然可以像普通的类库一样对待。基本上你是在欺骗 EF 工具,认为你的类库是一个控制台应用程序,但你不希望它在部署时被这样对待。

【讨论】:

【参考方案2】:

确保 MyWebApp 有一个带有名为 MyConnectionString 的连接字符串的 web.config。

Enable-Migrations 
    -ProjectName "ClassLibraryProject" 
    -ContextTypeName "MyDbContext" 
    -StartUpProjectName "MyWebApp" 
    -ConnectionString "MyConnectionString" 
    -ConnectionProviderName "System.Data.SqlClient"

【讨论】:

确实如此,不是这样。【参考方案3】:

我正在使用 Visual Studio 2017 我能够成功运行迁移的地方,它确实需要 在 DbContext 所在的类库中安装以下 NuGet 包

Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Tools

【讨论】:

【参考方案4】:

今天早上我遇到了同样的问题,我将 EF nuget 包更新为 Entity Framework 6.3.0。这有帮助。

【讨论】:

以上是关于无法在运行时设置 DbContext 连接字符串并将项目与应用程序分开的情况下运行 EF 迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何动态更改EF的DBContext的连接字符串

如何动态更改EF的DBContext的连接字符串

mysql dbcontext 怎么连接

.NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串

将连接字符串传递给代码优先的 DbContext

实体框架 MySQL DbContext 无法连接