我一直试图解决这个问题一段时间后我无法看到它是如何可能的,这似乎很奇怪,因为.NET Core已正确发布且EF6为still recommended for some mainline cases。但是,我是.NET Core的新手,所以希望我只是遗漏了一些明显的东西。
我有一个ASP.NET核心Web应用程序,并且一直在尝试在单独的项目中添加EF模型和迁移。我尝试了两条主要路径,两条路都遇到了不同的路障。
尝试1:将EF库创建为旧式类库
这在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类库
这种方法在运行“dotnet restore”时修复了错误,但是在打破用于创建迁移的包管理器控制台命令方面存在更为致命的缺陷(它们似乎需要.csproj文件才能工作)。 This answer looked like it might be a solution,但我无法让它为我工作。
我认为我的尝试1更有可能是正确的方法。在这种情况下,这个问题可以归结为“如何在非.NETCore库中使用'dotnet restore'?”
我刚刚找到了this thread,我从那里尝试了一些事情,但他们还没有工作,但我会一直看着它。
答案 0 :(得分:1)
据我所知,答案是“否”,如果你想要我认为合理的CI设置。如果您可以在CI服务器上运行VS2015的完整安装,您可以以某种方式使其工作。
我进一步尝试了1但最终看起来像一个终点(目前)路障。目前,Visual Studio 2015将创建正确包含我的EF项目的lock.json文件。但是,运行“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非常相似。
<强> DOTNET 强>
再次,您需要在构建服务器上安装它(不是不合理的)。但是,在尝试处理项目依赖项时会产生错误,因此您可能需要确保构建在此时不会失败(例如by doing this)
<强> MSBUILD 强>
此时我的当地Msbuild抱怨EF项目:
您的project.json未将“win”列为目标运行时。你应该在你的project.json中的“runtimes”部分添加“win”:{}',然后重新运行NuGet恢复。
该项目当时根本没有project.json文件,所以我添加了一个包含以下内容的文件:
{
"frameworks": {
"net452": {
}
},
"runtimes": {
"win": {}
}
}
暗示on this thread。虽然我刚刚注意到这个文件的存在阻止了nuget 3.5.0-RC1完全下载我的EF项目的Entity Framework依赖项(Nuget 2.8.6忽略了这个文件并下载了EF)
结束
此时我的本地msbuild将构建项目,只要我在VS2015中打开它,以便VS2015有机会构建正确的lock.json文件。
在我的CI服务器上,如果我注释掉“dotnet restore”步骤并将我的锁定文件提交给源代码控制,那么我的EF项目引用不再是问题(我仍然对实体框架本身的引用存在问题,但这可能是一个单独的问题)。但是,省略dotnet还原步骤并不是一个可行的解决方案 - 事情只是起作用,因为之前的步骤已经存在,并且已经下载了相关的依赖项。
请注意,如果您要尝试重现此操作,如果您运行“dotnet restore”,VS2015会立即注意并重新将lock.json文件重新写回工作版本,因此您需要关闭VS2015或拥有单独结帐以查看问题。