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

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

这样,当用户(其他程序员)可以在我在任何项目中选择的任何数据库上使用我的API和实体并设置连接字符串时,都可以在其应用程序启动时进行设置。现在,我试图在类库中生成迁移配置。我试过了:
Enable-Migrations -ProjectName "ClassLibraryProject" -ContextTypeName "MyDbContext" -StartUpProjectName "MyWebApp" -ConnectionString "MyConnectionString" -ConnectionProviderName "System.Data.SqlClient"

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



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

编辑:我发现了这一点:EF 6 with a dnx project,我的项目是目标为461运行时的Asp.NET Core类库,并在Asp.NET Core Web应用程序中使用。因此,没有办法使用带有ASP.NET Core的EF 6在类库中运行迁移吗?

最佳答案

好吧,经过一番尝试,默认情况下您无法执行此操作。自一月份以来,根本没有用于类库的工具,这对我来说似乎很可怕。我发布的链接中没有任何工具提到使用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

我能够成功运行迁移,它确实需要一些骇人听闻的东西,但是暂时可以运行,比其他地方提供的其他替代方法要好。

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工具以使您的类库是一个控制台应用程序,但是您不希望将其像部署时那样对待。

09-25 17:40
查看更多