标签存档:ef

登录ef core 2.2有一个更简单的语法——更像是asp.net core

自从EF Core出现以来,日志记录EF Core的内存操作和SQL操作已经发展了几次。它利用了与ASP.NET核心使用的相同的底层功能。如果您使用的是ASP.NET核心,日志记录是经过烘焙的,对于ef核心打开它并添加过滤非常简单。参见Shawn Wildermuth的博客文章ASP.NET核心中的EF核心日志记录

但是如果您不使用ASP.NET核心,这有点复杂。不是很可怕,但仍然有一些额外的工作要做。它涉及在dbContext中设置iLoggerFactory并同时定义任何过滤器。

我之前在MSDN杂志上写过一篇关于这个的文章(重点是利用各种可用的EF Core日志过滤器)。今天是1月1日,所以我可以说“最后一年”。数据点–在EF核心中记录SQL和更改跟踪事件。我也在我的EF核心2入门当然,EF核心2:映射EF Core 2.1:什么是新的多元化课程。(请注意,我已经将入门课程的示例代码更新为ef core 2.2,并将其放到了github上github.com/julielerman/PluralsightEFCore2GettingStarted

我的文章和课程使用控制台应用程序来演示EF核心行为,因此控制台日志提供者将日志程序与控制台联系起来。注意,Data Points文章包含了许多关于各种类型的过滤的详细信息。所以您可以使用下面的新语法来指定应该有一个过滤器,但是一定要阅读这篇文章来了解过滤的风格,以及根据您所做的选择,您能够看到哪些类型的细节。

但是日志API不断发展,并提供了一些与ASP.NET创建的相同的快捷方式。并且consoleloggerprovider已被弃用。API不是EF核心的一部分。它是。net Core的一部分。EF核心和ASP.NET核心都使用它。

如果您使用的是EF Core 2.2,语法已经改变了(简化了),在3.0中它将变得更加流线型。

事实上,如果将前面的语法与2.2一起使用,您将收到有关ConsoleLoggerProvider的警告:

过时的(“此方法已过时,将在将来的版本中删除。推荐的替代方法是使用LoggerFactory配置过滤,使用ConsoleLoggerOptions配置日志记录选项。

就比较而言,下面是一个使用旧语法打开日志记录的示例,只显示与数据库命令相关的日志,只显示标记为“信息”的消息。

EF Core 2.0和2.1逻辑

MyConsoleLoggerFactory = new LoggerFactory(new[] {new ConsoleLoggerProvider((类别,level)=>category==dbloggercategory.database.command.name&&level==loglevel.information,真实)};

一旦在context类中定义了logger工厂字段,就告诉DbContext在配置时使用它。

protected override void onconfiguring(dbContextOptionsBuilder OptionsBuilder)var connectionString=configurationManager.connectionStrings[“wpfdatabase”].toString();选项builder.useloggerfactory(myconsoleloggerfactory)。启用敏感数据记录(true)。usesqlserver(connectionString);}

所以这是记录器工厂的创建,它的语法有点复杂。新的API遵循了ASP.NET核心如何让您使用以过滤器为参数的addfilter方法进行过滤。不需要羔羊。另外,配置过滤器是一个单独的逻辑位,用于通知日志记录器它应该绑定到控制台。

EF核心2.2逻辑

有了EF核心2.2,您可以在构造函数或其他方法中设置日志记录器工厂,只要在配置选项构建器时它是可用的。我在一个方法中创建它,然后使用该方法作为useLoggerFactory的参数。我仍在筛选只显示标记为信息的数据库命令和日志详细信息。

{IServiceCollection serviceCollection = new serviceCollection ();servicecollection.addlogging(builder=>builder.addconsole().addfilter(dbloggercategory.database.command.name,loglevel.information));.GetService返回serviceCollection.BuildServiceProvider ()
             
              ();}
             

然后在optionsbuilder的UseLogging方法中调用GetLoggerFactory():

optionsBuilder.UseLoggerFactory (GetLoggerFactory ())

包和引用

为了使用AddConsole()方法,你还是要用Microsoft.Extensions.Logging.Console以前的consoleloggerprovider所在的包。然而,命名空间不需要using语句(就像对consoleloggerprovider所做的那样)。

EF核心配置和日志记录

今天的一些行为让我有些困惑,最后我意识到我的错误,所以我想和大家分享一下。这主要发生在我正在构建的不使用ASP.NET核心的演示应用程序中。

在这些情况下,我通常将dbContext提供程序配置坚持在onModelConfiguring方法中。例如,如果我用的是sqlite,然后在方法中指定如下:

配置时受保护覆盖无效(DbContextOptionsBuilder optionsBuilder)选项builder.usesqlite(@“filename=data/pubstracker.db”);}

我也经常使用伐木厂。定义它之后,我也配置它。我不太考虑我在哪里,所以把它随意地加了进去。

受保护的覆盖无效配置(dbContextOptionsBuilder OptionsBuilder)OptionsBuilder.useLoggerFactory(myConneleLoggerFactory);选项builder.usesqlite(@“filename=data/pubstracker.db”);}

然后我在一些测试中添加了不得不避免SQLite提供程序(如果InMemory提供程序已经配置好了),因此,我对usesqlite方法进行了包装,检查是否已经配置了选项生成器。

受保护的覆盖无效配置(dbContextOptionsBuilder OptionsBuilder)OptionsBuilder.useLoggerFactory(myConneleLoggerFactory);如果(!)optionsbuilder.isconfigured)optionsbuilder.usesqlite(@“filename=data/pubstracker.db”);}}

但我的逻辑行不通。我运行了一些迁移,但是他们突然不认识UseSqlite方法。这个句型我用过很多次了。我过了一会儿才意识到发生了什么事。的UseLoggerFactory是一个配置

我只需要在配置了检查之后移动useloggerfactory逻辑,一切都很好。

这是一件非常愚蠢的事情,你根本想不到别人会犯这样的错误。但因为它咬了我,我认为这是值得分享的,主要是为了下一个程序员谁试图解决相同的问题。

从NET Core或NET标准类库运行EF Core 2.0迁移的秘密

我有两个人看着我多元视野核心入门课程(即将加入英孚核心2:入门课程)问同样的问题,一开始让我迷惑。

正在运行导致项目编译的迁移命令,但是命令什么也没做。例如,add-migration没有添加迁移文件。get-dbcontext没有返回任何信息。最奇怪的是没有错误信息!我可以重复这个问题。

有了EF6,就可以从类库中使用迁移,而不需要看到任何exe项目。EF核心迁移可以从.NET框架或.NET核心项目运行,但不能从.NET标准运行。它需要一个运行时。一个常见的解决方法是,即使你还没有进入应用程序的用户界面部分,要将。net Core console应用程序项目添加到解决方案中,添加ef core design nuget包并将其设置为启动项目。但是仍然可以在不添加虚拟项目的情况下实现这一点。

我们已经知道了多目标修复,它解决了当您尝试从.NET标准库运行迁移时的错误。但即使有了这个修正,我们得到了神秘的虚无。

这个问题的答案隐藏在一个Github问题和EF核心文档中迁移文档的注释中。同样的解决方案解决了我试图在UWP应用程序中使用迁移时遇到的问题(同样,使用一个单独的类库来托管它的DbContext。

我写这篇博文是为了在解决问题之前提出解决方案。

为了从.NET标准库运行迁移,我们在EF Core 1.0中使用的解决方案是针对.NET标准的多目标迁移(因此您可以在几个地方使用该库). net Core(这样就可以运行迁移)。

这意味着更换

         
          
          
           网络标准20
          
         

         
          
          
           netcoreapp2.0; netstandard2.0
          
         

注意,属性名现在是复数,两个sdk之间有一个分号。

但还有一个秘密不在文件中。

对于.NET标准2.0(和EF Core 2.0),您还需要将以下内容添加到csproj。

         
          
           
         

现在将DbContext项目设置为启动,并确保包管理器控制台(或命令行)指向同一个项目,迁移命令将起作用。

感谢Christopher Moffat,他在Github问题中找到了解决方案,并在评论中分享了它。EF核心包管理器控制台工具文档。


托尼的截图……请参阅下面我的评论回复您的评论。

第一次进入。net Core 2.0

我必须从某个地方开始,所以我开始用超级婴儿步。下载.NET核心2夜间版本并尝试创建一个简单的控制台应用程序。我马上就惨败了。原因何在?夜间建造已经完成了!他们正在开发2.1.0,我不小心抓住了它。这对我来说有点太血腥了。

有一个码头工人形象你可以很容易地使用但我想试试CLI,VS代码和Visual Studio。因此,我想把这些比特直接安装到我的机器上。

我要给你们看的是我在macOS和Windows 10上做的第一个测试。我这样做只是为了确保事情运行正常。注意,在MacOS上,我刚在我的计算机上直接安装了这个新版本,在那里我有其他版本的.NET核心。关键是没有依赖于其他版本的生产工作,所以我不会搞砸任何重要的事情。版本可以并排运行。只是对于像我这样“知道足够危险”的人来说,尽管我知道创建本地nuget.config文件以及在global.json中指定版本等技巧,但很容易与版本纠缠在一起。在Windows上,然而,我使用的是一个干净的虚拟机,它没有其他版本的。net。不管怎样,这是明智的做法。虽然我在我的机器上尝试了不太聪明的installig方法,它已经有各种版本的框架,甚至我的版本控制技巧,我无法获得2.0.0来执行恢复或构建。

我在上面提到,我最初下载的SDK版本不正确。(请注意,典型的SDK安装还包括运行时…,所以我得到了两者的错误版本。你可以在里面看到血淋淋的细节这GitHub的问题我在解决问题时不断更新。)我想坚持使用.NET核心2.0.0。它的安装程序隐藏在github.com/dotnet/cli的一个分支中,而不是从主服务器获取绝对的最新版本。而是转到https://github.com/dotnet/cli/tree/release/2.0.0。有一个坚实的2.0.0版本- 2.0.0-preview2-006391。这是我在Windows和MacOS上使用的。

2017年6月11日\12-23-16.jpg

确保nuget知道在哪里找到包

您可以在创建项目之前更新全局nuget.config。另外,您可以创建一个项目,然后向其中添加一个本地nuget.config文件。

在MAC上,位于[user]/.nuget/nuget的全局配置文件。这是我的截屏,MacOS不是您的主要平台,您仍然在为这些事情而奋斗。

2017 - 06 - 11 - _12 32 - 15. jpg

在Windows中,在%appdata%\nuget\处。

我有一个链接到"配置Nuget行为“当我忘记在哪里找到它时,医生会帮我。

我将这两个键添加到我的PackageSources部分:


           
           

现在是时候创建一个项目了

我在Mac上,所以,到终点站我们就去。

我创建了一个名为efcore20的新文件夹——我知道这是.NET核心,但最终我也计划在EF Core 2.0中添加。
我的计划是创建一个.NET核心控制台应用程序(这将依赖于NetCoreApp2.0)和一个库。库将基于netstandard2.0库。这意味着它是一个我可以从各种各样的应用程序中使用的库,包括基于.NET 4.6.1的应用程序。EF Core 2.0也将依赖于。net标准2.0,所以任何应用程序或API都可以使用NetStandard,也可以使用EF Core 2.0。阅读更多关于这方面的信息 在GitHub上发布EF Core 2.0公告

我为efcore20文件夹中的每个文件夹创建了一个文件夹:

netcore2console
netstandard2lib

然后我将cd放入netcore2console应用程序中,使用以下命令创建该应用程序:

Dotnet新控制台。
就这些。这就创建了一个小小的Hello World应用程序。dotnet new命令还将在创建文件之后执行dotnet还原。这是你第一次看到事情是否再次发生。如果恢复失败,它会立刻告诉你。
这是我在事情不对时得到的信息:
错误消息:错误MSB4236:找不到指定的SDK“microsoft.net.sdk”。
“指定的”SDK是您正在引用的SDK的当前安装版本。在我看来,dotnet enw控制台的默认值是“dotnetcore”无论安装的版本是什么,都可以使用该版本。
最有可能的问题是,您没有为dotnet提供正确的URI来查找正确的NuGet包。
如果不想破坏全局配置,您可以使用应用程序在文件夹中创建本地nuget.config文件。整体而言,它看起来像:
           
           
            
             
             
            
           
即使dotnet new将调用restore,我喜欢打电话
网络还原
明确地。(控制狂)
如果恢复正确,那么验证的下一步是
网络建设
希望这也不会给你带来错误。它不应该。
最后,
网络游戏
会导致呕吐吗
你好世界!
现在我知道它起作用了。有点傻,但我想在浪费时间写一堆不会运行的代码之前验证一下,因为我甚至没有正确安装.NET内核。
另一个有趣的地方是dotnet new console创建了哪些文件。
如果我把它们打开会更容易看到 Visual Studio代码我可以通过打字
代码。
只有两个文件。带有项目元数据和程序文件的csproj。csproj文件说目标框架是netcoreapp2.0。

2017 - 06 - 11 - _14 - 09 - 46所示

程序文件启动时只会发出hello world。
2017年6月11日
下面是命令行中所有步骤的屏幕截图 dotnet新主机你好世界!输出包括我的额外 网络还原。我喜欢显式恢复的另一个原因是,它显示了关于恢复的更详细的信息。
2017 - 06 - 11 - _14 - 03 - 19所示
接下来,我想确保我可以得到一个。net标准库也可以工作。
仍在终端(或控制台或PS,如果您在Windows上)现在进入第二个子文件夹,ef core2/netstandard library.dotnet新库默认为对库使用netstandard。这很简单。
dotnet新图书馆
将创建库并恢复它所需的包。
以下是这个新库的默认内容,再一次,显示在vs代码中。
antie that its csproj说目标框架是netstandard2.0。 2017 - 06 - 11 - _14 16 - 09年
还有一个空的类文件。
2017 - 06 - 11 - _14 - 18 - 12所示
我将修改这个类,添加一个返回字符串的公共方法:你好!”
2017 - 06 - 11 - _14 22 - 01

现在,我将进入控制台应用程序的csproj,并给它一个库的项目参考。智能感知(还没有?)不能帮我解决这个问题,我的记忆力很差*,所以我去了奈特·麦克马斯特的Handy Project.json去了CSproj的Mind Mapper,又名project.json到msbuild转换指南提醒自己项目引用的语法。我将其添加到控制台应用程序的csproj文件的属性组部分下面

          
           
          
再次运行dotnet restore和dotnet build将有助于确定是否存在拼写错误。我经常这样做。
现在,我将修改Program.cs文件,也调用输出从我的库调用HiYa方法的结果:
2017年6月11日

然后回到我的终端窗口(尽管我也可以在VS Code的内置终端中完成)。我构建了这个库,然后切换到控制台文件夹。重建并运行它,就这样

netcore2console网络游戏

你好世界!

为什么,你好!

netcore2console

所以现在我知道.NET核心2(从夜间构建预览)正在我的计算机上正常运行,我可以创建和使用.NET标准2.0库。这意味着我可以继续创建一个. net标准2.0库来托管一些EF Core 2.0逻辑。

我也在我的Windows机器上重复了这整件事。这不仅让我知道我可以在那里使用这个版本的.NET核心,但我也将在Visual Studio中使用. net Core 2.0预览版做一些工作。

*(咄,我应该在VS代码中创建一个代码片段!)

使用VS2017的RTM和工具更改EF核心

当Visual Studio 2017今天发布时,发生了一些与实体框架核心相关的其他事情。yabo官网

更多关于英孚核心的信息,看我的EF核心:开始多元化视野课程

EF核心迁移工具发布

首先,我们为之做了准备,.NET核心SDK也发布了。最后一个稳定的版本是1.0.0-preview2-1-003137。现在只剩下1.0.0了。而且,其依赖的工具,还发布了用于PowerShell和dotnet的EF核心工具。随着.NET核心支持从project.json发展到msbuild,EF核心工具分离。我们一直在使用1.0.0-preview4(对于.net和project.json)和1.0.0-msbuild3来支持msbuild/csproj。

现在工具包是1.1.0(工具)和1.0.0(工具.dotnet)

对于PowerShell支持:Microsoft.EntityFrameworkCore.Tools 1.1.0
对于dotnet cli支持:microsoft.entityframeworkcore.tools.dotnet 1.0.0

在Visual Studio 2015(适用于完整的。net项目)和Visual Studio 2017(如下图所示,对于完整的。net或。net核心项目),包管理器将显示RTM版本:

形象

请注意,我没有“包括预发布”选中的。

如果使用PMC进行安装,只是

安装包microsoft.entityframeworkcore.tools

这是针对PowerShell工具的,否则,在名称中添加. dotnet。

但请注意,您不再需要添加–pre。

当使用CLI版本的工具时,命令

dotnet ef–版本

结果

实体框架核心.NET命令行工具1.0.0-rtm-10308yabo官网

对迁移命令的更改

随着预览工具的发展,一些细节改变了,例如,脚手架指挥变得更聪明了。

但是一个值得注意的变化是关于类库中的EF Core。您仍然需要指向可执行项目(exe或test)来运行大多数命令,但现在你至少可以使用“dotneef”要获得帮助文件,而不需要设置-startup-project参数。还有一些其他命令将在不了解启动项目的情况下运行。你可以在这里阅读更多这个GitHub线程。查看布莱斯·兰姆森(Brice Lambson)后来在开发这些命令时的一些评论。

EF核心1.1.1–补丁

这是释放的一个更微妙的部分。即使1.1.1 GitHub上的里程碑有30个错误修复都关闭了,没有人提到这会被推出去,里程碑上也没有目标日期。尽管我有我的怀疑!这是我3月5日的截图。

形象

是的,EF核心包的最新版本现在是1.1.1。这些是错误修复…正如增量所示。大多数是边缘案例,但无论如何,您一定要更新您的EF核心包,以确保您有这些最新的修复程序。如果你正在创建新项目,1.1.1您将看到Nuget提供的内容。

注意:在ef core 1.1.1中引入了一个回归,目标是用下一个补丁修复。您可以在这里阅读有关这个问题的信息:http://stackoverflow.com/questions/42708522/loading-related-data-aspnet-core-1-1

你可以在我的EF核心:开始多元化视野课程

排除用于ef核心迁移的dotnet ef命令

3月7日更新,2017年,在Visual Studio 2017发布之后。
同时,请记住,我一直在更新这篇文章(并将继续这样做),因为我发现新的方式,人们正在打击与dotnet ef的问题。

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

找不到与命令“dotnet ef”匹配的可执行文件

如果您来自我的Pluralsight EF核心课程,请注意

微软支持在VS2017中开发.NET核心应用程序。VS2015的工具已经过时,没有计划更新这些工具以获得新的CSproj支持。我记录实体框架核心:开始yabo官网课程多元化的视野,而VS2017仍在测试。在我们发布课程之前,我在RC3中重新创建了VS2017演示,我们选择离开剩下的仅在VS2015中的.NET核心演示。vs2015只支持project.json和为.net core 1.0设置的项目模板,而不是。net Core 1.1。因此,在本课程中,意味着我们将继续使用不完全一致的project.json支持和工具。但Pluralsight和我都认为,不把用户逼到流血的边缘是有道理的,甚至没有为演示发布VS2017。课程的重点是EF Core,只要我能让用户通过project.json安装工具,而不需要让他们成为专家,这是正确的道路。

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

“dotnet ef”可能会遇到的问题

虽然其中一些注释是针对课程中使用的project.json的,我还添加了一些将dotneef与新的csproj/msbuild支持结合使用的技巧。

有一些关键的事情需要注意。

  1. 当前用于EF核心迁移的稳定工具分为两个包。
    Microsoft.EntityFrameworkCore.Tools用于PowerShell
    Microsoft.EntityFrameworkCore.Tools.DotNet是针对CLI (dotnet命令)的
    确保您引用了包的tools.dotnet版本,这样您就可以访问CLI命令。如果你听我的这就解释了。
  2. dotnet英孚仅适用于.NET核心项目。如果你的项目目标是整个。net框架,然后需要使用PowerShell命令,例如。add-migration,- database就。
  3. 确保您正在从包含引用工具包的项目的文件夹中运行该命令。这在demo课程中有解释,但是在你兴奋的时候,你可能会忽略这一步!
  4. 如果您使用project.json*,确保工具部分中有tools.dotnet包,而不是依赖项部分。3月7日发布后,这将是“1.0.0”。
    *前进,您应该只在.NET核心1.0项目中使用project.json。如果您正在使用当前的. net Core(1.1+),那么您应该使用csproj/msbuild。

    “tools”:“Microsoft.EntityFrameworkCore.tools.dotnet”:“1.0.0”}
  5. 如果你使用csproj/msbuild,确保工具包列在dotnetclitoolsreference标记中。3月7日发布后,这只是版本“1.0.0”。

               
  6. 如果你使用csproj/msbuild,如果在csproj中手动添加包,请确保外壳是正确的!我见过人们打字时被绊倒Dotnet而不是多特耐特
  7. 您可能必须正确放置工具,但您的IDE没有触发Dotnet还原。所以你可能需要手动操作。这是一个例子,它咬了某人。https://github.com/aspnet/EntityFramework/issues/7801
  8. 此时您不应该使用VS2017的RC,但我将把它留在这里。
    如果您使用的是Visual Studio 2017的较老版本候选版本(在RC3之前),cli工具尚未与msbuild支持对齐,因此该版本,您必须使用PowerShell命令进行迁移。因此,您必须使用工具包并在包管理器控制台中工作,而不是命令行。

               

    从vs2017 rc3(这是我在课程最后一个模块中展示的内容)开始,可以使用上面第4点所示的msbuild3和cli命令。3月7日发布后,这将是“1.0.0”。

  9. 确保您的目标是关系数据库。迁移只适用于那些,而不是,例如,InMemory。一个twitter的朋友偶然遇到了这个问题,并得到了“没有找到可执行文件”错误消息。
  10. 确保您正在使用的EF Core工具版本与您机器上的. net Core版本一致。

在我的EF核心课程,我用的是EF Core 1.1除了最后一个模块,我正在使用Microsoft.EntityFrameworkCore.tools.dotnet 1.0.0-preview4。(我正在更新课程以使用新的1.0.0包)

您需要安装。net Core 1.1和相关的dotnet SDK -不是简单的编号。今天。net Core SDK工具还在预览中,所以当前的版本号是“稳定的”与.NET核心1.1配套的构建是1.0.0-preview2-1-001377。

请注意,2017年3月7日VS2017正式发布时,.NET核心SDK工具也将发布,因此版本将只是普通数字,如1.0.0。

下面是一个例子dotnet英孚命令将告诉您是否未安装.NET Core 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 Core 1.0和. net Core 1.1运行时。这个SDK可以同时使用这两种运行时。我在Windows x64上,所以我的下载是列表上的第一个…Windows x64安装程序。NETCORESDK10

仅供参考,如果选择运行时下载集,然后您将只获得特定版本的运行时,而不是SDK。

netcore11runtime

这是安装后,打字dotnet将向您显示计算机默认运行的运行时版本。这是后者。在使用两个运行时安装1.0 SDK之后,dotnet告诉我,我正在运行运行时的1.1.0版本。

dotnet - version给出了sdk的版本。这已经显示了一个补丁,因为结果显示为“1.0.1”。

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

给你一些额外的建议!

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

在我的Pluralsight EFCore课程,我在自己的类库项目中有dbContext。所以,当运行dotnet英孚,在解决了上述所有问题之后,您将得到一条新消息,它指出命令依赖于要运行的可执行文件。该邮件如下:

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

在我看来,我还没有准备好向解决方案添加UI或测试,所以我添加了一个最小的控制台应用程序来满足这个需求。它需要使用dbContext引用项目。一旦排序,你可以用-创业计划的参数dotnet英孚命令指向该项目。当我在课程中展示这些的时候,你也可以在我的msdn杂志文章中看到:msdn.microsoft.com/magazine/mt742867

这将使EF核心工具的msbuild版本更容易接触到。使用新的工具,你至少还能跑dotnet英孚要在不指向启动项目的情况下获得命令的帮助,尽管要运行子命令,您仍然需要指定启动项目。

在Visual Studio 2015中通过Nuget安装EF核心工具

其中一位观众报告了一个奇怪的问题。他能够在project.json中添加ef核心工具包,并按预期使用来自cli的迁移。但是,如果他试图从nuget包管理器或包管理器控制台添加包,他又回到了旧的“找不到与命令“dotneef”匹配的可执行文件”错误。

他最终注意到,当NuGet试图下载包时出现了错误。但在他看来,错误是微妙的,所以他不知道工具包没有安装。下面是他分享的截图:

frsBKTFTRSjBGOFFZDJ6_nugetmanager

我了解了如何使自己陷入类似的困境,并得到了一条更有用的错误消息:

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

包“microsoft.entityframeworkcore.tools.dotnet 1.1.0-preview4-final”使用当前版本的nuget不支持的功能。要升级nuget,请参阅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年2月27日

有一个预览EF核心与msbuild在VS2017

一些人向我提到,他们决定在课程的演示中直接进入VS2017。他们还说,他们对一些差异感到困惑,必须做一些研究。当我问其中一个开发者是否看过我在课程结束时所做的VS2017演示以及早期演示之前的VS2017演示时,他肯定是在踢自己。(他的回答是“嗯,现在你告诉我!”)它列在课程目录中。如果你先看一眼,我认为在VS2017中进行所有演示会容易得多!我目前正在更新VS2017 demo,使用RTM和最新的工具。

希望这有帮助!

实体框架核心:从Pluralsight开始yabo官网

我很高兴与大家分享一门关于Pluralsight的新课程-实体框架核心:开始yabo官网

我在预告片中是这样描述的:

大多数软件——无论是用于商业还是娱乐——都是由用户需要交互的数据驱动的。在实体框架核心:开始yabo官网,您将学习如何使用微软的现代数据访问平台,实体框架的核心。yabo官网您将学习如何构建数据模型,使用EF Core连接你的软件和你的数据存储,以及如何将所有这些整合到桌面,移动和Web应用程序。当你完成这门课程后,您将掌握实体框架核心的基础知识,这将有助于您进一步在.NET中构建软件,yabo官网无论你的目标是Windows,OS X或Linux。所需软件:Visual Studio 2015或Visual Studio 2017。

多元课程

2017年2月15日

这是课程中的模块列表。您可以在上看到每个模块中不同剪辑的标题。Pluralsight

要查看我关于Pluralsight课程的完整列表,去multuralsight.com/authors/julie-lerman

ef core cli命令与vs2017 rc3

Visual Studio 2017 RC3昨天发布,但不幸的是,安装问题使其在短时间内重新上市。注意这个地方,等待RC3的返回!

但是我设法安装了它,并想向您展示EF Core CLI命令现在正在工作。如果你一直在玩vs2017 rc和ef core,你可能会遇到这样的问题:ef core工具包还没有与.NET core的msbuild工具同步。这个问题现在已经解决了,它不仅起作用,而且还有一个我很高兴看到的变化。

一如既往,我有自己的dbContext项目。以下是该项目的csproj内容:

形象

请注意,dotNetclitoolReference指向的是Microsoft.EntityFrameworkCore.tools.dotnet。dotnet和PowerShell命令在单独的包中公开。与“.DotNet”是包含CLI命令的包。没有“.dotnet”是包含PowerShell命令的包。

更重要的是,包版本来自“1.1.0-preview4”“1.0.0-msbuild3-final”。我无法解释为什么我们从1.1.0降到1.0.0,但是这是一个更新的、正确的包。

然后,打开一个命令提示符。我可以使用常规的命令,但是我使用PowerShell命令的唯一好处是……我可以缩短提示符。下面是我对大部分路径(但不是全部)进行修剪的命令:

Quora:如何在我的Windows Powershell提示函数中获得当前文件夹名?

记住,我指的是类库的路径。dotneef要求您指向包含可执行文件的路径,以便运行命令。但是最新的数据,您可以获得帮助,而不必指向可执行文件。谢谢你!布莱斯·兰伯森。这是一个元数据,需要弄清楚,因为不仅仅是从命令中得到帮助,你不得不在谷歌上搜索如何获得帮助。这里有一个简单的dotnet英孚获取顶层的命令dotnet英孚的帮助,然后dotnet ef数据库上下文获取有关dbcontext子命令的帮助。

形象

要运行依赖于api的命令,如果从类库中运行命令,那么仍然必须指向启动项目。在这里,我运行命令来列出项目中的迁移。我只有一个,sqlite-init。

形象

在从EF6到EF核心的过渡过程中,对特性(除了EDMX)的一些深入了解

我已经为我的多元视野EF核心课程写了这些细节(希望在2017年1月底出版),但我决定不在课程中花时间解释这一点。相反,我将把它放在这里,课程将有一个链接到这篇博客文章!聪明的,嗯?

您可能听说过很多关于EF Core没有从EF Core中提出基于EDMX的设计器的事情。这是我听到最多的反馈意见。但是还有其他的英孚特征也在被削减。这些对开发人员来说并不是那么令人担忧——基于我自己的经验并关注社交媒体的反应——但重要的是要意识到这些剪切特性中最大的一个。

对象上下文API

第一个是ObjectContext API。这是EF的变更跟踪和数据库交互的原始机制。由于EF4.1于2011年初随dbContext发布,微软建议所有新项目都使用DbContext。DbContext位于ObjectContext之上,代表您执行与ObjectContext交互的更麻烦的工作。但是,为了与EF4和EF3.5项目向后兼容,ObjectContext仍然是公共API。同时,我们可以访问ObjectContext,根据需要执行低级任务。

在ef core中不会有objectcontext API。而不是依赖ObjectContext进行元数据工作,变更跟踪和数据库交互,这个低级活动正在重新构造,我们将直接从DbContext获取它。如果你有旧的软件仍然在使用ObjectContext,而你现在还没有更新它,我希望,你无论如何都不想把它更新到efcore。我在2014年为《msdn》杂志写了一篇由两部分组成的文章,其中包括如果您认为您可能想要探索的话,将ObjectContext代码移动到dbContext的指南。

数据点:更新和重构实体框架代码的技巧,第1部分yabo官网

数据点:更新和重构实体框架代码的提示第2部分yabo官网

实体SQL

实体SQL是最初的基于字符串的查询SQL,类似于为EF编写的语言。当英孚第一次发布的时候,它已经接受了同样新的LINQ。ESQL只能与ObjectContext API一起使用。我想我曾经是世界上少数几个真正知道如何使用ESQL的人之一,因为我在我的第一本书《EF》中对它进行了广泛的介绍,让它和LINQ一样对实体可见。在第二版中,我把ESQL的细节分成了他们自己的一章,因为到那时很明显它几乎没有被使用。多年来我没有任何理由使用ESQL。我也没听说过有人用它。因此,它将随着ObjectContextAPI逐渐消失,不会成为EFCORE的一部分。

边缘用例映射&原始元数据api

实体框架允许在类/属性和数据库表/字段之间的映射上有很多变化。yabo官网它甚至允许您将这些疯狂的映射组合到一个模型中。EF团队的博客文章强调并举例:“结合TPH的继承层次结构,TPT以及在同一层次结构中拆分所有实体的TPC映射。”这是可能的,因为元数据工作区API。但是在这种灵活性中的构建也意味着使用那个API是非常复杂的。内部查询编译难于设计。对于开发者来说,发现关于模型元数据的信息非常麻烦。

所以,EFCORE有一个更简单的元数据模型,这意味着一些真正的边缘大小写映射是不可能实现的。这并不意味着像继承这样的东西会消失(尽管目前,EF Core只支持TPH),时髦的,罕见的映射组合。

MEST(单个类型的多个实体)

一种单一的映射技术将会消失,那就是MEST。在我多年的英孚工作中,我从来没有遇到过任何利用它的人。它只得到了edmx和objectcontext的支持,团队决定不将其应用到基于代码的模型和efcore的dbContext中。

自动迁移

迁移是从基于代码的模型演化数据库模式的关键技术。我们有两种使用EF迁移的方法——默认方法是通过包管理器控制台显式添加迁移,然后使用各种技术应用这些迁移。另一个选择是使用自动在运行时动态计算并执行的迁移。对自动迁移的支持导致了对迁移支持的一些主要问题。它强制迁移将模型快照直接存储在数据库中。这给使用常规迁移的开发人员带来了问题——尤其是在源代码控制方面。我在循环中无法添加迁移,因为它认为我需要执行迁移,但当我尝试执行迁移时,它告诉我必须添加一个迁移。我不是唯一一个在尝试管理迁移时陷入循环问题的人。这些问题将会消失,因为EFCore根本不会尝试自动化迁移。你可以在布莱斯·兰布森的博客文章中了解更多关于这个的信息。EFCore在设计时的迁移。Brice是EF团队的一名工程师,有很多其他有趣的博文值得一看。

这些是最值得注意的EF特性,团队根本不打算在EFCore中实现这些特性。就我个人而言,我从来没有或很长一段时间没有使用过它们,我也引导我的客户远离它们。所以如果你在同一条路上,您可以很好地使用EF Core而不用担心它们。

将我的EFCore / WebAPI / PostreSQL / XUnit Repo更新到1.1

今天,我致力于更新我的长期运行的存储库示例,从ef core是ef 7时开始,到ef core:1.1的最新版本。以下是更新的报告:https://github.com/julielerman/efcore-aspnetcore-webapi-rtm。

此更新的第一阶段继续使用project.json。

除了更新Nuget包引用的版本#s之外,我还对代码做了一些修改,以反映一些新特性。

注意工具包。在工具部分,包的名称已经更改——注意末尾的DotNet——并且版本当前是1.0.0-preview3,尽管IIS版本是preview2。

“tools”:“microsoft.aspnetcore.server.iisintegration.tools”:“1.0.0-preview2-final”,“microsoft.entityframeworkcore.tools.dotnet”:“1.0.0-preview3-final”},

在依赖项中,efcore设计包与efcore的其余部分一样是1.1.0。这是EF api的一部分,不是工具。

代码更改….

您将发现存储库类中使用的dbset.find方法和change tracker加载方法。这些都被添加到了EF核心1.1中。

我修改了WeatherEvent类,使用对映射到IEnumerable的支持来完全封装其反应集合。这导致了对构造函数的一些更改,并添加了AddReaction方法和局部变量。

与EF核心无关,我还修改了seeddata.cs类。它读取一个硬编码的seed data.json文件来读取种子数据。这些数据使用的是旧数据。我想要数据显示当前日期,以帮助我告诉我真的和真正地将新数据推入数据库。由于WeatherEvent的Date属性是私有的,我的方法是读取原始JSON并更新日期值,然后将原始JSON保存回原始文件。然后,我将具有当前日期范围的JSON反序列化为一组天气事件。这也意味着我在中添加了删除/创建数据库,这样每次启动应用程序时,数据库都会被丢弃并重新创建/重新种子化。

测试也会更新以使用最新的包。除了更改版本外,我不得不添加一个对旧包(internal alservices)的引用,因为它的依赖项在xunit中还没有更新。

这是测试项目的完整project.json,因为我必须通过谷歌搜索才能找到它。

{“版本”:“3.0.0 - *”,“description”:“使用aspnetcore测试简单应用程序,efcore和postgresql。开发并运行在OSX上。“作者”:[“Julie Lerman”yabo官网),“testranner”:“xunit”,“dependencies”:“microsoft.entityframeworkcore.inmemory”:“1.1.0”,“src”:“3.0.0”,:“xunit 2.2.0-beta4-build3444”,“dotnet test xunit”:“2.2.0-preview2-build1029”,“Microsoft.DotNet.InternalAbstractions”:“1.0.0”},“frameworks”:“netcoreapp1.0”:“dependencies”:“microsoft.netcore.app”:“type”:“平台”,“版本”:“1.1.0”},“进口”:[" dnxcore50 ",“portable-net45 + win8中的”]}}}

希望你能找到这个存储库有助于了解EF核心1.1的实际应用。

哦,根据布拉德·威尔逊的微博,我在global.json文件中添加了sdk!

现在我要去了解为什么这很重要。很明显!