标签存档:aspnetcore

将我的efcore/webapi/postresql/xunit repo更新为1.1

今天,我致力于更新我的长期运行的存储库示例,从ef core是ef 7时开始,到ef core:1.1的最新版本。以下是更新后的repo: https://github.com/julielerman/EFCore-ASPNetCore-WebAPI-RTM。

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

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

注意工具包。在“工具”部分中,包名称已更改–结尾是note dotnet–,尽管IIS版本是preview2,但当前版本是1.0.0-preview3。

“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。这是英孚API的一部分,不是工具。

代码更改….

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

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

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

测试还将进行更新,以使用最新的包。除了改变版本,我必须添加一个对旧的包(InternalServices)的引用,因为它在XUnit中的依赖关系尚未更新。

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

“version”:“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”},“imports”:[“dnxcore50”,“便携式-net45+win8”}}

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

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

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

ef core让我们最终定义notracking dbContexts

回到2012年,我向EF6添加了一个功能请求,允许我们定义一个上下文,它永远不会跟踪从数据库中检索到的实体。

支持只读上下文或DbSet

如果您有一个用于只读数据的dbContext,那么这就不必在所有查询中添加asNotTracking。更重要的是,如果您的dbContext用于将要断开连接的数据,因此从不跟踪后期查询。这意味着Web API、服务或控制器。如果您检索大量数据,并且没有更新计划,那么跟踪可能会很昂贵。而且必须记住在每个查询中添加AsNoTracking是一个PIA。

我刚刚发现,这是可能的EF核心,我认为它甚至在EF核心1.0版本!

有一个名为QueryTrackingBehavior的ChangeTracker属性,它采用了一个QueryTrackingBehavior枚举,其选项为NotTracking和TrackAll。

有很多地方可以使用它,但我对感到兴奋的是,将它直接放置在dbContext的构造函数中,使上下文默认为从不跟踪任何实体。

public class bookContext:dbContext public booksreadonlycontext()changetracker.querytrackingbehavior=querytrackingbehavior.nottracking;}公用数据库集
         
          书籍获取;设置;等…
         

一个快速测试,我检索了一些书,检查了changetracker。条目返回0,为了证明这是我5年来一直梦想的!感谢英孚团队!

console.writeline($“跟踪的实体:context.changetracker.entries().count()”);

另一点需要注意的是,正如您总是能够使用dbset的asnotracking方法关闭对特定查询的跟踪一样,现在,您可以使用Astracking打开特定查询的跟踪。

我的.NET在网络边缘的Mac演示上的视频

上周在Awesome多特内条纹波特兰会议,俄勒冈州,我做了一个30分钟的演示,用我可爱的MacBookPro上的Visual Studio代码构建了一个带有实体框架的ASP.NET Web API。yabo官网所以它是Mac上的.NET(编码,调试和运行)。是*那个*跨平台。

我还谈到了ASPNETCOREEFCORE.我用了其他跨平台的东西,比如JetBrains数据报用于与多个平台上的多个数据库交互的IDE,PostgreSQL数据库,Xunit用于测试等等!

这是一船的乐趣,它在YouTube上:

我在演示中展示的解决方案位于我的Github存储库中:Julielerman/efcore aspnetcore webapi rtm公司

更新到RC2:EFCORE的变更,ASPNETCARE,PostgreSQL驱动程序和Xunit

这是我的Github上的efcore RC2演示

期待已久的第二次发布候选名单于本周早些时候发布(以下是该团队的公告:宣布ASP.NET核心RC2

我一直坚持使用RC1,并避免在微软向RC2发展这个堆栈的过程中干扰夜间的构建,因为很多东西都在改变。其他人更勇敢,比如韦尔德莫斯大胡子肖恩·博伊尔以及一直在构建依赖aspnet核心的产品和工具的悲伤的人们。

因此,一旦新的位被释放,我坐下来,最终更新了我自3月以来一直在会议上使用的样本应用程序,这些会议仍然在RC1上。虽然都是跨平台的,我一直在OSX中直接在我的MacBook上研究这个示例,并且只使用corecrl来向自己证明这个东西是真正的跨平台的。我甚至把单声道放在一边。

我有两层要攻击的问题:首先获取新的corecrl(以及提供dotnet命令的cli,取代DNX,dnvm和dnu)放在我的MacBook上,第二个是更新我的示例,它依赖于各种技术和API。

我已将应用程序的更新版本推送到Github并将其重命名:https://github.com/julielerman/efcore-rc2-演示.但我想和大家分享一下我为使这一切正常运转所做的一些事情。肖恩写了一篇更新他的应用程序的好帖子ASPNET文档有一个从RC1更新到RC2的文档也。我先从这些开始。我将集中讨论一些我必须做的改变,这些改变要么没有包含在这些帖子中,不是很明显,或者只是让我心痛。

不过,我绝对建议您查看我的存储库,因为它确实有工作代码,所以如果您遇到了一些问题,而这恰好是我已经做过的事情,你可以在我的应用程序中找到一个可以借鉴的例子。

把rc2 cli放到我的MacBook上
对大多数人来说,这应该很容易。只需按照上的说明Microsoft的.NET核心页(不同平台有不同的页面)。

它似乎起作用了。但是当我试图转换我的代码时,我很快就遇到了一些问题,这些问题导致了一些线程说我可能没有正确的版本。有一个问题是需要从系统中删除多少内容,这样就不会有遗留的旧的corecrl块挂在周围,从而导致冲突。事实上,更新的一个关键元素是运行卸载脚本(在链接到上面的说明页上)。有一个请求更新该脚本,以便在安装新版本之前更好地清除旧版本。(从那时起,该pr已被修改和合并,现在您将从说明页中获得。)

我抓取了现有的请求脚本版本并运行它,然后重新运行安装程序。于是开始了一系列令人沮丧的时间,因为突然间dotnet命令消失了。我一直得到“找不到dotnet命令”错误。(见下一节)。请记住,我对OSX还是相当陌生的,所以我失去的一些时间是由于诸如被要求去“USR”之类的事情。路径和我的Windows大脑将其转换为用户/朱丽叶尔曼。我犯了去后者的错误。这浪费了很多时间。但我最终把它解决了。

因为我没有直接的成功之路,很难说到底什么是错的,什么是对的。希望新的卸载脚本可以做到这一点。如果不是的话,我建议你看看这方面的想法:在带有rc2位的osx上找不到dotnet命令

在OSX上找不到dotnet命令?
解决dotnet在OSX上不出现的问题有两个重要的方法。
1)对于使用zsh作为默认命令行而不是bash的用户:
“path_helper在OSX上使用zsh的方式存在问题。解除阻止的最简单方法是使用以下方法将dotnet二进制文件符号链接到/usr/local/bin:
ln-s/usr/local/share/dotnet/dotnet/usr/local/bin

这可能最终不是必需的。见这个问题关于让卸载程序在zsh上更智能的对话。

2)bash上的dotnet命令有问题
另一个用户也有同样的问题,但是在bash上,所以symlink不是答案。最后,他发现一些应用程序在他的~.bash_配置文件中安装了以下内容:
导出路径=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/applications/github.app/contents/resources/git/bin:/applications/github.app/contents/resources/git/libexec/git-core
尽管Zlatko K(来自CLI团队)提出了以下建议,但他完全删除了它并取得了成功:

你可以保留它,只需要以下几点:

导出路径=$path:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/applications/github.app/contents/resources/git/bin:/applications/github.app/contents/resources/git/libexec/git-core
我不知道是谁对你的.bash_个人资料做的,但这就是为什么会发生这种事。是的,他们不应该这样做。他们也应该添加您的路径。

正在更新Visual Studio代码和(Yippe)调试!

因为我是在Mac上做的,我不具备Visual Studio的所有优点,但是Visual Studio代码非常棒。由于它的局限性,这真的迫使我更加深刻和难忘地吸取教训,而对于vs,多亏了所有的额外支持,我可以摆脱更多的困难。如果我在我的普通电脑上(读:windows),我绝对会使用vs,不是VSCode)。所以在Mac上做所有这些让我在理解我所做的每一件事情时有一些优势。而且,在使用Windows这么久之后使用Mac很有趣。但我并不是想告诉任何人他们应该在Mac上完成所有的.NET编码。

所以如果你不介意的话…用RC1,VS代码没有调试支持。所以我不得不让错误发生,然后读取堆栈输出来找出错误所在。再一次,更加困难,但对我来说是个好教训。但拜托一定要更新vs代码和C扩展到它们的最新版本。vs代码将帮助您创建一个默认的launch.json文件,以便调试器知道如何启动您的应用程序和一个task s.json来定义在launch文件中指定的构建任务。

如果还没有launch.json,则在调试时会发生这种情况。注意Debug和绿色箭头右边的框。它说:“ “因为没有找到启动文件。系统会提示我创建一个新的节点,并从node.js中进行选择,vs代码扩展dev,.NET核心或Chrome。.NET核心是您想要的。

它将在编辑窗口中创建并显示新文件。

您需要对缺省值做一个更改,即指向应用程序的dll,该dll是一个一个构建而成的。我失败了,因为我没有注意到一个角托架从位置保持架。

这是使用占位符得到的原始行:

“程序”:“$ {workspaceRoot} / bin /调试/ /

目标框架是(当前)netcoreapp1.0。我的项目名是SRC,因为我是一个Dope,从未更改过该文件夹名。所以dll在/src/bin/Debug/netcoreapp1.0/文件夹中。因此,新值为:

“program”:“$WorkspaceRoot/src/bin/debug/netcoreapp1.0/src.dll”,

更新代码

一旦我解决了这个问题,是时候修改我的代码了。再一次,我会从肖恩和球队的帖子(上面的链接)开始,关注那些明显的,不那么明显的东西。这将覆盖名称空间等内容,一种更新的启动等主要方法。我会指出对我来说意义重大的变化。但请查看我的Github存储库的提交和历史记录以了解更多详细信息。

连接EF和ASPNET Core在Startup.cs中的依赖注入服务

这段代码看起来很不一样。我们曾经明确地加上了框架,然后添加[dbprovider],然后设置注入提供选项的上下文。这是旧密码

services.addentityframework().addnpgsql()。
ADDB上下文
(选项=>选项.usenpgsql
(配置[“data:postgreconnection:connectionString”]);

有了新的代码,只需添加dbContext,这表示对EntityFramework的明显依赖。同样地,use[dbprovider]方法触发对提供程序的明显依赖。更简洁。

服务.adddbContext
(= > options.UseNpgsql选项
(配置[“data:postgreconnection:connectionString”]);


我的dbContext类中的更改

我使用的是dbContext的重载构造函数,它允许我传入一个aspnetcore服务提供程序。这是为了让我的集成测试能够利用IOC服务和依赖项注入。接受ServiceProvider的dbContext重载已消失,因为有更好的方法。

所以我删除了weatherContext类的构造函数。

我的上下文类中有一些黑客代码,以确保数据库表名是“复数”的。因为这在EFCORE中还不存在。我在某些地方读到过至少使表名与DbSet名对齐,但是a)我还没有看到这一点,b)我通常不会为映射到数据库表的每个实体创建DbSet。所以我把黑客代码留在里面了。您可以在WeatherContext类中看到它。它只是迭代上下文所知的实体,并指定相关的talbe应该具有实体的名称加上一个“s”。我从Rowan Miller (EF项目经理)分享的要点中得到了这一点。

在集成测试中使用ServiceProvider

更有趣的是,在我的测试类中,对如何使用服务提供程序所做的更改允许使用更清晰的代码。注意,我有两个版本的测试类。其中一个很简单,我直接实例化上下文并传入指定使用InMemory提供程序的选项。另一个是为了利用ASPNET核心的IOC/DI服务而构建的。这就是我要改变的。

最初在这个测试类的构造函数中,我必须创建一个ServiceCollection(它与aspnet核心服务相关联),并且,指定要使用EF和InMemory数据库。这类似于我在上面更改的启动时的原始代码。

_ serviceCollection=新建serviceCollection();
_ serviceCollection.addentityFramework().addinMemoryDatabase();

对该代码的更改类似于在启动文件中所做的更改:
_服务=new servicecollection();
_ services.adddbContext(options=>options.useInMemoryDatabase());

(请注意,我将变量名改为_services)

接下来,在我创建上下文实例并填充它的设置代码中,我使用这些服务创建了一个服务提供者,并将其传递到WeatherContext构造函数中。这就是上下文获取数据库信息的方式。我从MusicStore示例中复制了这段代码,现在我正为它挠头,因为我仍然在实例化WeatherContext,而且我还有那个选项参数。所以这是没有意义的。尽管如此,代码不见了,我现在使用服务来完成他们的工作:

var serviceProvider=_services.buildServiceProvider();
var serviceScope=serviceProvider.getRequiredService().createScope();
context=serviceScope.serviceProvider.getService();

提供程序现在将为我实例化上下文,并且服务知道InMemory提供程序。我想知道我以前是否可以这样写。但值得庆幸的是,dbContext甚至不能再将serviceProvider作为参数,所以我被迫开始编写更好版本的代码。.

说到测试:XUnitAPI的变化亚博国际网页
我的测试使用Xunit。布拉德·威尔逊和他的团队已经更新了Xunit,以便与RC2合作。这需要对测试项目中使用的project.json进行一些更改。我查看了文档并将注意力集中在依赖项部分,上面缺少一个重要的细节。

请看医生Xunit.net(NET核心/ASP.NET核心)入门“。所有的信息都在那里,让我突出重点,尤其是我忽略的那个!

我忽略的一点是有一个新的参数叫做testRunner它的值是,惊奇,XUng.

依赖项中的包的名称相同,但它们的版本已更新。以下是我的测试项目在project.json中必须更改的内容:

“testranner”:“xunit”,
“依赖项”:。{
“xunit”:“2.1.0”,
“dotnet test xunit”:“1.0.0-rc2-build10015”
}

同样重要的是更新nuget包的位置。这将出现在新的nuget.config文件中,您将在其中列出包源。

以下是我的nuget.config中指定xunit包的rc2版本所在的源的行:

正在将refs更新为postgresql
当我在我的应用程序中合适的时候(比如说测试的时候),我正在使用PostgreSQL。RC2包的名称与RC1不同。和它,同样,已移动到稳定的包源。

在project.json中,我退出了:
“entityframework7.npgsql”:“3.1.0-rc1-3”,

对于
“npgsql.entityframeworkcore.postgresql”:“1.0.0-*”,

请注意,Microsoft要求所有提供程序使用EntityFrameworkCore遵循此命名模式。

包源也已移动到一个稳定的位置。以下是我的nuget.config文件中的相关列表:

我必须确保在我的计算机上删除缓存的包。因为我一直在尝试和尝试,但并不总是做得对,我发现自己正在清除我计算机上的包列表所在的缓存(记住我在Mac上)

~/.local/share/nuget/v3 cache/然后查找包含源名称的文件夹,例如“****api.nuget.org.v3”。

另外,我还得去掉实际的包裹。那些在

~/.nuget/packages/[包名称]

因为我是OSX新手,我要澄清一下“~”将主文件夹表示为用户。我希望我能帮上忙,但每个人都认为你知道那是什么意思。这是我的文件系统。MacintoshHD是我的电脑。我做了一个显示隐藏文件和文件夹的技巧。那些是灰色的,不是黑色的。我深入用户,然后是我(朱利亚勒曼)。那是~。这就是起点。接下来的专栏文章就是安蒂希。您可以看到.local文件夹。我在屏幕截图中把它切掉了,但是.nuget文件夹就在下面。

文件夹

这将帮助您确保您得到正确的软件包。

别忘了把包裹继续放回去。在某个时刻(当我有了越来越多正确的东西,例如launch.json,等)Visual Studio代码执行还原的提示符最终切换到运行“dotnet还原”。命令而不是旧的“dnu update”。但有一段时间,我只是在命令行运行dotnet restore,您可以看到它在何时找到正确的包和何时找不到包之间的区别。

这是一个过程

我应该提醒你,这并不是一帆风顺的。在代码中工作时,我必须让包无错误地恢复。然后,我必须修改代码和构建,查看错误列表,然后修复它们,再次构建,修复一个dbuild,修复、构建、修复和构建。

一旦我得到0个错误的构建,然后我可以试着跑。我在命令行(dotnet run)上来回运行,并在Visual Studio代码中进行调试,这时我需要一步一步地真正了解错误的来源。

控制器类

我真的不需要对控制器类做任何事情。我已经停止使用团队正在试验的特殊ef更改跟踪参数(添加/更新/删除参数),因为我知道它会消失。

我知道在RC2中对MVC的一个很好的改变是,如果您遵循一个提醒.NET这是一个控制器类的约定,那么就不必显式地从控制器类继承。所以我从WeatherController和ValuesController中删除了它,但后来又将它添加回了第一个,因为我不想将Dispose添加到类中。.

播种数据

EFCORE还没有一种内置的方式来种子数据,就像我们习惯于先使用代码一样。对于RC1,我从MusicStore示例中借用了一个示例来播种数据,并根据需要对其进行了修改。这是我的存储库中的seeddata类。这个类是由Web API的启动程序调用的,它利用了ASP.NET服务(IOC工具),因此我可以与EF交互,并将种子数据保存到数据库中。我不得不修改我的RC1版本,以符合我已经讨论过的关于如何使用“带外”上下文的更改。所以我在这里所做的更改类似于我在上面提到的控制器类中所做的更改。基本上,我让它使用SErviceProvider使用在启动时已经定义的默认值为我实例化WeatherContext。因为我在测试课上展示了上面的变化,我就不重复了。因为这个示例是一个演示,我使用ef的ensuredatabasedeleted和ensuredatabasecreated在seed类中删除和重新创建(和重新设置)数据库每次我运行应用程序。

EF迁移

我的演示还使用了迁移,所以我必须让所有的工作再次进行。大多数更改都与project.json文件相关。

通过RC1向上,在entityframework.commands包中找到了migrations命令。另外,每个提供者都附带了一个名为.design的第二个包,使用ef命令所需的。

因此,我的应用程序rc1 project.json(而不是测试)在依赖关系中包含了以下内容:

“entityframework7.npgsql”:“3.1.0-rc1-3”,
“entityframework7.npgsql.design”:“3.1.0-rc1-5”,
“entityframework.commands”:“7.0.0-rc1-final”,

EntityFramework命令已经被包装到现在被视为coreCrl工具的工具中。所以它的包现在有了名称tools,而且所有的工具都在一个不同的路径中准备好了。他们的诗句表明了这一点。这是我之前展示的Postgres新包旁边的新包名称:

“npgsql.entityframeworkcore.postgresql”:“1.0.0-*”,
“microsoft.entityframeworkcore.tools”:“1.0.0-preview1-final”,

请注意,设计包不在那里。我忘了把它添加进去,我的迁移也起了作用,结果发现它们可能是不需要的(至少不是因为我迄今为止所做的迁移)。这对建造供应商的Shay Rojansky来说甚至是个惊喜。.

然而,让Migraton工作还有另一个重要的方面,它对project.json有很大的改变。您必须添加一个新的“工具”部分。用于IIS集成的Kestrel服务器也必须添加到工具中,因此我将在project.json文件中向您显示整个工具部分:

"工具":{
“microsoft.aspnetcore.server.iisintegration.tools”:。{
“version”:“1.0.0-预览1-最终”,
“imports”:“portable-net45+win8+dnxcore50”
}
“microsoft.entityframeworkcore.tools”:。{
“version”:“1.0.0-预览1-最终”,
“进口”:(
“便携式-net45+win8+dnxcore50”,
“便携式-net45+win8”
]
}
}

在RC1中,我们还为命令添加了快捷方式。要使用Kestrel服务器,我们可以在命令行键入dnx web和“web”是我融入社会的捷径。为了使用迁移,我们从“dnx ef”开始。EF是EntityFramework.Commands程序集的快捷方式。命令不再存在。相反,我们列出了工具。但是我们如何指定快捷方式呢?是的,我想知道。对于实体框架,yabo官网它是内置的。我可以输入"。net ef"并获得快乐的小魔兽独角兽以及可用于EF迁移的命令列表。

多特内夫

我写了一篇文章关于新的迁移命令efcore的大量文章如果你想了解命令。这篇文章还包括您可能在Windows中熟悉的命令的PowerShell版本,例如添加迁移。

有更多的变化,但在我的记忆中没有比这些更突出的了。您可以在我的存储库中看到工作代码,并查看它的历史记录,以了解它是如何演变的。不幸的是,不是只有一个提交将我从RC1带到RC2,所以您可能需要查看一些历史提交以查看旧代码和新代码。

OSX,ASPNETCARE,efcore和corecli,哦,我的天哪!

在将一些RC1测试项目从Windows移到我的MacBook之后,是时候在OSX中从头开始看看这种体验是什么样的了。安装所有正确的部件。我已经在Windows上使用了Visual Studio代码进行节点编程,但对于ASP.NET 5项目来说,这样做有点困难,因为对它的调试还没有实现。与此同时,我还在习惯在Mac电脑周围导航……bash命令等

但是我得到了一个小样本,甚至用PostgreSQL来做这个工作。

那(记住,RC1)小测试是在github这里:github.com/julielerman/ef7osxtest.

但是RC2是另一种动物!

附录,因为有很多人问:我正在使用RC2的夜间版本。还没出来!

DNX正在使用新的基础API转换到corecli。有人改名了。asp net 5成为ASP.NET核心,ef7成为ef核心。包和命名空间已更改。

同时,EF7/EFCORE仍在对RC2进行更改。对我来说,最重要的是团队一直在做的工作,以帮助断开图。你可以读最新的(我认为是最后的)在GitHub上,EF如何处理断开连接的图的状态.

我尝试了一些方法来启动一个新项目来尝试RC2。以下是一些Twitter证据:

我看过大卫·福勒和达米恩·爱德华在国家数据中心伦敦谈论核心CLI的视频,大卫在Mac上做了演示。

但托尼打了个喷嚏,提醒我可以从Github上下载大卫的演示:

的确,这是最好的起点。我把这个存储库克隆到了我的MacBook上,并确保我可以运行这三个项目。

现在我正在通过添加模型来构建hellomvc项目,数据库上下文控制器和来自我的RC1的其他相关位。

目前(截至2016年2月1日)dotnetf迁移命令不起作用,但brice lambson正在努力工作,并表示这一点本周应该提高。(手表)这个Github问题

可能要过一段时间Postgres提供程序将得到更新以使用新的命名空间和包依赖项。但我们确实有可以在OS X上工作的microsoft.entityframeworkcore.sqlite提供程序,尽管目前在Linux上似乎有很多问题。但我还是要试试。