繁体   English   中英

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

[英]Can't run EF migration where DbContext connection string is set at runtime and separate project from application

我有一个类库项目,其中有一个 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,版本=14.1”中键入“Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject”。 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 : SerializationException

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

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

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

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

好的,经过仔细研究,默认情况下您无法执行此操作。 自 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 Dev Command Prompt 运行迁移。 导航到项目目录,并运行上面链接的自述文件中描述的迁移命令。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM