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

Sve*_*ang 6 c# entity-framework ef-migrations entity-framework-6 asp.net-core

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

public DbContext() : base(ContextInitializer.GetConnectionStringName())
    {
Run Code Online (Sandbox Code Playgroud)

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

Enable-Migrations -ProjectName "ClassLibraryProject" -ContextTypeName "MyDbContext" -StartUpProjectName "MyWebApp" -ConnectionString "MyConnectionString" -ConnectionProviderName "System.Data.SqlClient"
Run Code Online (Sandbox Code Playgroud)

根据这里遇到相同错误的其他答案,它没有帮助.我还是得到:

异常调用 "SetData的" 与 "2" 的参数(一个或多个):在装配"类型 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject'"Microsoft.VisualStudio.ProjectSystem.VS.Implementation,版本= 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:SerializationException

异常调用 "SetData的" 与 "2" 的参数(一个或多个):在装配"类型 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject'"Microsoft.VisualStudio.ProjectSystem.VS.Implementation,版本= 14.1. 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)+ ~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +类别信息:未指定:(:) [],MethodInvocationException + FullyQualifiedErrorId:SerializationException

异常调用 "SetData的" 与 "2" 的参数(一个或多个):在装配"类型 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject'"Microsoft.VisualStudio.ProjectSystem.VS.Implementation,版本= 14.1. 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)+ ~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +类别信息:未指定:(:) [],MethodInvocationException + FullyQualifiedErrorId:SerializationException

我在这里看到的其他答案说使用-StartUpProjectName参数,我这样做但仍然得到错误.我认为这是因为我的项目在我正在使用的解决方案中的嵌套文件夹中,但是将项目名称提供为"path/ProjectName"会触发错误,找不到项目,因此不可能.

编辑:我发现这个:带有dnx项目的EF 6,我的项目是Asp.NET Core类库,目标是461运行时,并在Asp.NET Core Web应用程序中使用.因此,使用带有ASP.NET Core的EF 6无法在类库中运行迁移?

Sve*_*ang 4

好吧,经过一番研究,默认情况下你不能这样做。自一月份以来,根本没有用于类库的工具,这对我来说似乎很糟糕。我发布的链接中没有提到使用 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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

public class Program
{
    public static void Main(string[] args)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

您现在可以从 VS2015 Dev 命令提示符运行迁移。导航到项目目录,然后运行上面链接的自述文件中描述的迁移命令。

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