疑难解答EF核心迁移的DOTNET EF命令

已更新2017年3月7日的Visual Studio 2017年发布之后。
另外,请记住,我一直在更新这个帖子(并将继续这样做),因为我发现新的方法的人击中DOTNET EF问题。

当使用EF核心在.NET核心应用(ASP.NET核心或其他应用程序坐在.NET核心),它很容易尝试在命令行中使用EF核心迁移时遇到一个问题。最常见的是

没有找到匹配的命令"dotnet-ef"

如果你来自我的Pluralsight EF核心课程,请留言

微软支持发展中国家在VS2017的.NET应用程序的核心。为VS2015的工具已经过时,有给他们带来了最新的新的csproj支持没有计划。我记录我的yabo官网实体框架的核心:入门当然在Pluralsight而VS2017是仍处于测试阶段。虽然我做了重新的RC3权VS2017演示之前,我们出版的过程中,我们选择了离开.NET核心演示,仅仅是在VS2015的其余部分。VS2015只支持project.json和项目模板设置你的.NET 1.0的核心,而不是.NET核心1.1。所以在使用过程中表示:我们会坚持project.json支持和工具这并不完全一致。但Pluralsight和我都一致认为,它使不出来也迫使用户最前沿,甚至没有发布VS2017的演示。本课程的重点是EF核心,所以只要我能手持通过project.json设置东西的用户,而无需让那他们的专家,这是正确的道路要走。

从课程发布不到两周以来,已经有近2000人观看了课程,其中一些人在版本控制和获得“没有找到可执行文件”消息方面遇到了一些困惑。我和他们一起解决了这些问题,但是我想把我的建议写下来,并写一篇我可以指出来的博文。

问题你可能会遇到“DOTNET EF”

虽然这些笔记是专门用于在使用过程中project.json使用,我还添加了使用诀窍的dotnet EF与新的csproj / MSBuild的支持。

有几个关键的事情需要注意的。

  1. EF的核心迁移当前稳定的工具被分成两个包。
    Microsoft.EntityFrameworkCore.Tools是的PowerShell
    Microsoft.EntityFrameworkCore.Tools.DotNet是用于CLI(DOTNET命令)
    一定要参考工具。DOTNET的version of the package so that you have access to the CLI commands. If you’re following my course, that’s explained.
  2. DOTNET EF只能在.NET的核心项目。如果你的项目目标的完整的.NET框架,那么你就需要使用PowerShell命令例如添加迁移,更新数据库。
  3. 确保您正在从包含引用工具包的项目的文件夹中运行该命令。这是解释在课程演示,但仍然是一个步骤,你可能会忽略你的兴奋!
  4. 如果您正在使用project.json *,请确保您有Tools.DotNet包中的工具部分,而不是依赖关系部分。在3月7日发布之后,这将仅仅是“1.0.0”。
    *展望未来,您应该只使用项目。. net Core 1.0项目的json。如果你正在使用当前的。net核心(1.1+),你应该使用csproj/msbuild。

    “工具”:{ “Microsoft.EntityFrameworkCore.Tools.DotNet”: “1.0.0”}
  5. 如果您使用的csproj /的MSBuild,确保工具包在DotNetCliToolsReference标签中列出。3月7日发布后,这将只是版本“1.0.0”。

  6. 如果您使用的csproj /的MSBuild,确保外壳是正确的,如果你手动添加包的csproj!我见过人们通过键入得到绊倒DOTNET而不是DOTNET的
  7. 这有可能是你有正确的工具放置,但你的IDE没有触发DOTNET恢复。所以,你可能需要做手工。这里有一个例子,其中该位的人。https://github.com/aspnet/EntityFramework/issues/7801
  8. 你不应该使用VS2017的RC在这一点,但我在这里留下这一个。
    如果您使用的是较老的Visual Studio 2017(在RC3之前)候选版本,那么CLI工具还没有与msbuild支持一致,因此在该版本中,您必须使用PowerShell命令进行迁移。因此,您必须使用Tools包并在包管理器控制台中工作,而不是在命令行中。

    < DotNetCliToolReference包括= " Microsoft.EntityFrameworkCore。工具”Version = " 1.1.0-preview4 " / >

    如VS2017 RC3(这是我显示过程的最后模块中的)是可能的使用msbuild3如图点#4的上方和CLI命令。在3月7日发布之后,这将仅仅是“1.0.0”。

  9. 确保你的目标关系数据库。迁移只有那些不工作,例如,InMemory。Twitter的朋友不小心碰到了这个问题,并为获得“无可执行找到”错误消息。
  10. 确保您正在使用的EF核心工具的版本与您机器上的。net Core版本一致。

在我的EF核心课程,我使用EF核心1.1和EF工具和所有,但最后一个模块,我使用Microsoft.EntityFrameworkCore.Tools.DotNet 1.0.0-preview4。(我在更新过程中使用新的1.0.0包的过程)

你需要.NET核心安装1.1和相关DOTNET SDK -未编号为根本。今天,.NET核心SDK工具仍处于预览,因此目前的“稳定”的构建与.NET 1.1的核心云的版本号是1.0.0-preview2-1-001377。

请注意,在3月份的时候VS2017已经在其官方发布7时,.NET核心SDK工具也将被释放,这样的版本只会像1.0.0正常的数字。

这里是什么样的一个例子DOTNET EF命令会告诉你,如果你没有安装.NET 1.1核心有做:

指定的框架'Microsoft.NETCore '。App',版本'1.1.0'未找到。检查应用程序依赖关系和目标框架版本安装在:C:\Program Files\dotnet\shared\ Microsoft.NETCore。App -安装以下版本:1.0.1 -或者,安装框架版本“1.1.0”。

你可以通过下载网格正确的版本在microsoft.com/net/download/core。网格只公开稳定版本。如果你正在寻找每晚构建(这在这个时候你需要使用的csproj支持),还有那些刚刚在网格下面的链接。

该组的下载,你通过得到LTS按钮是.NET的核心1.0.3。该当前按钮为您提供了最新的稳定版本。该SDK按钮可以让你在运行时+ SDK,而运行时按钮让你只运行。

该SDK安装会给你的SDK和运行时间。当你选择了一套SDK安装的,它说,它是.NET的核心1.0。这指的是SDK的版本。它也将安装.NET 1.0的核心和.NET 1.1核心运行时间两者。这单SDK能够同时与运行时的工作。我在Windows 64位,所以我的下载列表中的第一个...在Windows 64安装程序。netcoresdk10

正如一个供参考,如果你选择Runtime集下载,那么你只会得到一个运行时间和特定的版本不是SDK。

netcore11runtime

它的安装后,打字DOTNET会告诉你,你的运行时版本你的机器默认情况下运行。这就是后来的一个。安装1.0 SDK既运行时间后,DOTNET告诉我,我正在运行的版本1.1.0。

DOTNET -version为您提供了SDK的版本。这已经显示出我,有一个补丁,因为结果显示“1.0.1”。

如果您安装了这个新的SDK,但是仍然看到旧的SDK版本(1.0.0-preview2-001313),这可能是因为该版本是在全局变量中指定的。解决方案的json文件。这应该不会对使用迁移命令造成问题,但是在global.json中列出正确的版本是一个好主意。

一些额外的技巧为您服务!

命令只能从可执行/测试项目运行

在我的Pluralsight EFCore课程我有在的DbContext自己的类库项目。所以,当运行DOTNET EF,解决所有上述问题后,你会得到它只是指出的命令将取决于一个可执行文件运行新的消息。该消息是这样的:

无法在启动项目“TestEFCore.Data”上调用此命令。这个版本的实体框架核心。net命令行工具yabo官网不支持ASP类库项目上的命令。NET Core和。NET Core应用。

就我而言,我还没有准备好一个UI或测试添加到解决方案,所以我加了一个最小的控制台应用程序只是为了掩饰这一需求。它需要引用具有的DbContext项目。一旦这样排序,你可以使用 -启动项目的参数DOTNET EF命令指向该项目。虽然我在我的课程中展示了所有这些,你也可以在我的MSDN杂志文章中看到:msdn.microsoft.com/magazine/mt742867

这将让触摸具有的EF核心工具的MSBuild的版本更容易。随着新的工具,你至少能够运行DOTNET EF让没有指向一个启动项目的命令的帮助,虽然跑分的命令,你仍然需要指定启动项目。

通过的NuGet在Visual Studio 2015年安装EF核心工具

其中一个当然的观众报告一个奇怪的问题。他能够像预期的那样从CLI中添加的EF核心工具包project.json和使用的迁移。但如果他试图从NuGet包管理器或包管理器控制台中添加软件包,而不是,他又回到了旧的“无可执行找不到匹配的命令‘的dotnet-EF’”的错误。

他终于发现有错误时的NuGet尝试下载包。但在他的IDE中的错误是微妙的,所以他不知道这是不是安装的工具包。下面是他分享的截图:

frsBKTFTRSjBGOFFZDJ6_nugetmanager

我想通了,如何让自己变成一个类似的绑定,并得到了很多更实用的错误信息:

2017 - 02年- 27 - _17 - 08 - 52

Microsoft.EntityFrameworkCore.Tools包”。DOTNET的1。1。0-preview4-final' uses features that are not supported by the current version of NuGet. To upgrade NuGet, see http://docs.nuget.org/consume/installing-nuget.

尽管Visual Studio的扩展管理器没有注明可用更新,它列出我的NuGet包管理器版本为3.5(最新的),我了解到,负责此扩展的团队已经暂时停止推通知的更新!这种变化是这篇博客的“不自动更新”一节中指出:http://blog.nuget.org/20161027/Announcing-NuGet-3.5-RTM.html

所以我不得不明确地下载最新的VSIX(忽略它似乎有相同的版本号,因为我已经安装了一个事实!)从NuGet分布页面。安装在此之后,它解决了从安装程序包管理器和程序包管理器控制台中的EF核心工具包的问题。

2017-02-27_17-14-46

有一个在EF核心先睹为快在VS2017的MSBuild

向我提到的几个人,他们决定通过在使用过程中的演示工作时直来直去VS2017。他们也说,他们对一些差异感到困惑,不得不做一些研究。我确信,这些开发者的一个被踢自己,当我问他是否观看了VS2017演示中,我试图VS2017与早期的演示沿着以前那样在课程结束。(他的回答是“嗯,现在你告诉我!”),它是在为课程内容表中列出。所以,如果你采取偷看在第一次,我觉得这样做在VS2017所有的演示将是一个容易得多!我目前在更新VS2017演示使用RTM和最新工具的过程。

希望这可以帮助!

报名参加我的通讯所以你千万不要错过我的会议及Pluralsight当然通告!

关于……的18种想法疑难解答EF核心迁移的DOTNET EF命令

  1. 在2017年VS 1中创建ASP.NET核心Web API
    2.二手EF核心在内存提供者到的DbContext工作。没有安装的SQL Server的是,在过程
    3. CRUD与在内存中的Web API工作正常,SQL Server安装完成
    4.现在除去EF核心内存提供商,加入EF核心SQL Server包,设置连接串
    5.开始EF迁移,这并不工作(我们的鸣叫转换)。DOTNET的工具还存在的MSBuild。
    6.创建一个新的ASP。NET Core Web API在vs2017中,增加了EF Core Sql Server包、连接字符串等。
    7.开始EF迁移,一切运作良好。创建迁移文件夹,创建数据库还,甚至进行网络API CRUD。

    以上步骤我遵循,不知道为什么这个问题,但一切有关您的PS课程和博客帖子是完美的。

    非常感谢您的宝贵时间!

  2. 感谢您解释这一点,对我帮助很大!Just one question… I’ve been using dotnet cli for ef with VSCode, I usually add EF packages using “dotnet add package …”, but I can’t do that with “Microsoft.EntityFrameworkCore.Tools.DotNet”, I have to do it manually in .csproj file so it can be added as a tool and not a package:

    你知道,如果有一个dotnet的CLI命令添加“Tools.DotNet”作为一种工具,而不是一个包?

    问候!

    1. 有趣的你应该问,因为我刚刚发现,你不能在VS2017从包管理器添加Tools.DotNet包。你必须做手工......编辑的csproj文件。看到这个问题的GitHub我加了不到一个小时前:https://github.com/aspnet/EntityFramework/issues/7838。我的猜测是,出于同样的原因,在DOTNET CLI命令无法处理它要么但我要问对同样的问题。

  3. 感谢张贴此,朱莉,这是一个很大的帮助!

  4. 当你的改造为VS2015发布(7Mar17),您也应该更新“练习文件”(又名entity-framework-core-getting-started.zip),其中有2Feb的最新文件(除了10Feb17的* .PDF)的一部分。
    因此
    “EF核心1.1Visual工作室2015年更新3本课程将得到更新,以备将来EF核心”
    显然还在待办事项清单上。我将继续关注更新,因为重犁旧沟不是流行的选择,和世界(至少2000 PS用户你注意到)等待!蒂雅

    1. 我所做的更改,并在等待Pluralsight发布他们。我没有重做每一个演示,因为大部分是在VS2015纯.NET反正和罚款。但许多并说得很清楚,事情改变了,在那里我以前不和原因。如果我重做所有的演示,它会在一个月完成这件事进出。我会做一个全新的课程......都在VS2017为完整的.NET和.NET核心演示。

  5. 哎呦我的意思VS2017发布
    (我责怪2年后CTP,预览和RCS我的肌肉记忆)。现在必须重新教育的.csproj的。
    我的哥哥认为,“怎么回事,一切我喜欢做的是非法的,不道德或育肥?”应该有“或导致大鼠肿瘤”追加。
    我建议,“唯一确定的是死亡和税收”应该有“和新的软件版本,打破变化,需要基本和痛苦的重新学习”。
    “如果我有更多的时间,我会写一个较短的函” [报价]

  6. 在你的PS当然=”实体框架的核心入门”yabo官网模块=”创建数据模型和数据库与EF芯”夹=”创建数据模型”:你推荐的Mads K公司的‘添加新文件’扩展名。我有2个问题,这
    1.有几个问题包括忽略VS选项卡设置等
    https://github.com/madskristensen/AddAnyFile/issues
    2.完全不必要的,因为你可以很容易地按住Shift + Alt + C添加类
    (如果你真的想演示菜单键击,你可以做Alt键P,C)

    如果你同意,在你重新记录,请抑制这种偏离主题的群众演员因为恕我直言,它混淆了EF消息。蒂雅

  7. 这些工具的DOTNET CLI软件包版本似乎很慢。在PowerShell中,Windows命令行或Visual Studio代码的终端窗口,输入类似的dotnet EF迁移-help一贯花费6秒内做出回应。这是正常的吗?

  8. 我一直在试图从本教程交换内存数据库:
    https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-vsc

    ......到的LocalDB,但是当我运行`DOTNET EF migration增加InitialCreate -v`,我得到...

    失败:Microsoft.EntityFrameworkCore.Database.Command [20102]
    程序无法执行的DbCommand(7毫秒)[参数= [],的CommandType =”文本”,的CommandTimeout = '30’ ]
    选择案例
    WHEN EXISTS(
    选择1
    FROM [TodoItems] AS [T])
    THEN CAST(1 AS BIT)ELSE CAST(0 AS BIT)
    结束
    System.Data.SqlClient.SqlException(0x80131904):无效的对象名称TodoItems“。

    但我认为第一个迁移将*创建*表。它为什么会失败,因为我准备做表尚未作出?

    全部细节在这里:
    https://stackoverflow.com/questions/48794847/

    1. (现在加入作为答复,我看到以前的帖子,你可能要缓和重复后)

      回答我之前的问题(在审核队列中;对不起,跳过它,sorta),你不能运行迁移脚本(至少不是初始脚本)与DatabaseContext种子数据,就像我所遵循的教程为其在内存中的db所做的……

      https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-vsc#add-a-controller

      如果(_context.TodoItems.Count()== 0)
      {
      _context.TodoItems。添加(new TodoItem {Name = " Item1 "});
      _context.SaveChanges();
      }

      取出数据播种,和DOTNET EF迁移工作得很好。

  9. 回答我之前的问题(在审核队列中;对不起,跳过它,sorta),你不能运行迁移脚本(至少不是初始脚本)与DatabaseContext种子数据,就像我所遵循的教程为其在内存中的db所做的……

    https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-vsc#add-a-controller

    如果(_context.TodoItems.Count()== 0)
    {
    _context.TodoItems。添加(new TodoItem {Name = " Item1 "});
    _context.SaveChanges();
    }

    取出数据播种,和DOTNET EF迁移工作得很好。

    1. 没有什么我更爱比我之前甚至有机会来看看它已被回答的问题。良好的侦探!

  10. 不知怎的,我的项目文件(myproject.csproj)删除我有(Microsoft.EntityFrameworkCore.Tools.DotNet)提出,当我重新启动解决方案的参考,所以我又把它并重装的解决方案,无需关闭它。

    我注意到另一件事是,该命令需要互联网成为机器上运行。我为了了解更详细的执行增加了-v切换到命令,发现它试图连接到互联网。

  11. 广播:ASP.NET博客
  12. 广播:net的博客
  13. 嗨朱莉,
    首先落在EF核心的优秀文章。

    你能帮我解决我在项目中添加迁移时遇到的错误吗?详情如下:

    *所有关于我的项目设置:
    版本使用:
    1. ASP.Net 2.2核心
    2. EF核心2.2

    我已经安装了所有必需的包,以使EF核心(V2.2)

    该迁移在我的项目工作得很好,当我在我的Program.cs没有播种的逻辑。但是,一旦我做了更改
    ”公共静态IWebHost(**和不IWebHostbuilder **)CreateWebHostBuilder(串[]参数)”

    当我开始迁移是failing.Below当我尝试添加迁移错误堆栈跟踪

    而在类的“纲要”访问IWebHost发生错误。继续而不应用服务提供商。错误:对象没有设置为一个对象的一个​​实例。

    无法创建类型“AceEntities”的一个目的。在设计时所支持的不同模式,见https://go.microsoft.com/fwlink/?linkid=851728

    我试图寻找这一点,但没有成功的解决方案。
    能否请您提出一个解决办法?

发表评论

您的电子邮件地址不会被公开。必填字段已标记*

本网站使用的Akismet,以减少垃圾邮件。了解您的意见如何处理数据