我可以在具有 ASP.NET 核心 Web 应用程序 (.NET Framework) 的单独项目中使用 EF6 迁移吗?

Can I use EF6 migrations in a separate project with a ASP.NET Core Web Application (.NET Framework)?

我已经尝试解决这个问题一段时间了,但我看不出这怎么可能,考虑到 .NET Core 已正确发布且 EF6 是 still recommended for some mainline cases,这似乎很奇怪。但是,我是 .NET Core 的新手,所以希望我只是遗漏了一些明显的东西。

我有一个 ASP.NET 核心 Web 应用程序,并且一直在尝试在单独的项目中添加 EF 模型和迁移。我尝试了两条主要路径,但都遇到了不同的障碍。

尝试 1:将 EF 库创建为老式 class 库

这在 Visual Studio (although you have to mess around with the start-up project) 中工作正常,但是当我尝试使用 "dotnet restore" 从命令行构建东西时(所以我可以得到我的 CI设置)我得到:

Errors in C:\MyProject\src\My.Website\project.json
Unable to resolve 'My.DataModel' for '.NETFramework,Version=v4.5.2'.

使用 "dotnet" 命令似乎是 运行 命令行构建的新方法,但也许这不是这种情况的正确方法?

尝试 2:将 EF 库创建为 .NET Core class 库

这种方法修复了 运行 "dotnet restore" 时的错误,但更致命的缺陷是破坏了用于创建迁移的包管理器控制台命令(它们似乎需要 .csproj 文件才能工作) . This answer looked like it might be a solution,但我无法让它为我工作。


我认为我的尝试 1 更有可能是正确的方法。在这种情况下,这个问题可以归结为 "how do I use 'dotnet restore' with non-.NETCore libraries?"

我刚找到 this thread,我已经从那里尝试了一些东西,但它们还没有奏效,但我会继续关注它。

据我所知,答案是 "No" 如果您想要我认为合理的 CI 设置。如果您可以 运行 在 CI 服务器上完整安装 VS2015,您也许能够以某种方式让它工作。

我的尝试 1 走得更远,但最终遇到了看起来像终端(目前)的路障。目前 Visual Studio 2015 年将创建 lock.json 正确包含我的 EF 项目的文件。但是,运行ning "dotnet.exe restore" 将删除引用我的 EF 项目的行并中断构建。

我希望最终 dotnet.exe 会赶上 Visual Studio 并正确处理项目依赖关系,但目前这似乎是一个终端问题。即使我将 lock.json 文件提交到源代码控制,CI 服务器也需要 运行 dotnet restore 来降低依赖关系,因此会破坏 lock.json 文件。

为了走到这一步,我不得不跳过很多其他的障碍,所以我会在下面记录下来,以防对其他人有所帮助。

Nuget

您需要将 nuget 安装到您的构建服务器上(或让您的构建下载它)。这可能很常见,但我们的构建服务器上还没有 nuget。我尝试过 nuget 2.8.6,它似乎只下载 .csproj 依赖项,而 nuget 3.5.0-rc1 的行为似乎与 dotnet.exe.

非常相似

网络

同样,您需要在构建服务器上安装它(并非不合理)。但是,它会在尝试处理项目依赖项时产生错误,因此您可能需要确保您的构建不会在此时失败(例如 by doing this

Msbuild

此时我的本地 Msbuild 抱怨 EF 项目:

Your project.json doesn't list 'win' as a targeted runtime. You should add '"win": { }' inside your "runtimes" section in your project.json, and then re-run NuGet restore.

那个项目当时根本没有 project.json 文件,所以我添加了一个包含以下内容的文件:

        {
        "frameworks": {
            "net452": {
            }
        },

        "runtimes": {
            "win": {}
        }
    }

on this thread 中所暗示。虽然我刚刚注意到这个文件的存在完全阻止了 nuget 3.5.0-RC1 下载我的 EF 项目的 Entity Framework 依赖项(Nuget 2.8.6 忽略了这个文件并下载了 EF)

结束

此时,只要我在 VS2015 中打开项目,我的本地 msbuild 就会构建项目,这样 VS2015 就有机会构建正确的 lock.json 文件。

在我的 CI 服务器上,如果我注释掉 "dotnet restore" 步骤并将我的锁定文件提交到源代码管理,我的 EF 项目引用就不再是问题(我仍然有问题对 Entity Framework 本身的引用,但这可能是一个单独的问题)。但是,省略 dotnet 还原步骤不是一个可行的解决方案 - 事情之所以有效,是因为该步骤之前已经存在并且已经下载了相关的依赖项。

请注意,如果您要尝试重现此内容,VS2015 会注意到并立即将 lock.json 文件重写回工作版本,如果您 运行 "dotnet restore"所以您需要关闭 VS2015 或单独结帐才能看到问题。