类别档案:资料存取

在运行时在Azure上迁移EF核心的快速提示

关于我的英孚核心2入门课程的一个问题是:

嗨,朱莉
谢谢你的课程。我有个问题。您能否建议将代码先迁移部署到生产数据库(azure)的最佳实践是什么?我是说我创造了
ASP.NET使用代码优先迁移方法的核心MVC和EF.core应用程序。在部署到Azure之后。如果我更改代码优先方法中的任何模式,如何更新生产数据库中的模式(而不丢失生产数据库中的数据)

我的回答是一些我认为值得在课程讨论之外分享的想法。(注意这只是高层次的)

为了简单的解决,我使用的一个路径是在启动时调用database.migrate。VS发布工作流有一个选项,您可以在发布应用程序时检查是否应用迁移。您可以在MS文档中看到在Azure上部署一个aspnet核心应用程序:

或者您可以在program.cs文件中进行编程,该文件将执行任何需要的迁移。我的A中有一个这样的例子2019年4月《MSDN杂志》文章.如果你需要更健壮的,然后,您可以用ef核心迁移生成脚本(可能是等量脚本),然后将它们包含在更新中,并使用可以应用这些脚本的工具。如果你使用红门工具,也许他们SQL更改自动化工具。另一种工具是像FlywayDB这样的迁移工具(flywaydb.org)或液体数据库。我用过带集装箱的飞机跑道。这是我最近在使用它的地方做的一个会议演讲:bit . ly / 30 ahgar

使用MongoDB C API的一些编码模式

在MSDN杂志2019年2月刊(使用其用于MongoDB的API探索Azure Cosmos DB的多模型功能),“我的数据点”专栏探讨了使用Azure Cosmos DB的MongoDB模型mongocsharpdriver.我首先处理MongoDB的本地实例,然后处理Azure实例。但是这个专栏有点长,所以我剪掉了一些无关的部分。所以我把它们放在这里,并链接到这篇文章的博客文章。

在本文中,我使用imongocollection对象查询数据并将其存储到数据库中。必须为要序列化和反序列化的集合对象指定类型。在文章中,我把集合输入到类中,例如,收藏 .也可以将集合一般地键入bsondocument。这里有一些关于这个的信息和一些代码。

将集合键入BsonDocument

映射的另一个路径是使用不依赖于特定类型的bsondocument类型的集合对象。这将允许您拥有更多的通用方法。但这也意味着手动序列化和反序列化对象,这很容易使用TobsonDocument进行序列化:

var coll = db.GetCollection
         
          (“船舶”);coll.insertone(ship.tobsondocument());
         

鉴于这些文件有鉴别器,然后,您可以在查询中指定一个类型来检索特定的类型,默认情况下,层次结构没有得到解释。本文引用了关于c# API多态性的文档。以下是链接.检查以更详细地了解如何正确实现多态性。下面的代码只会在_t与配置的鉴别器匹配的情况下将文档提取到Ship into ships和DecommissionedShip into dShips:

var coll = db.GetCollection
         
          (“船舶”);var ships = coll.asquerizable ().OfType
          
           ()var dShips = coll.asquerizable () .OfType
           
            ()
           
          
         

封装MongoClient,数据库和集合

重复指定类型化集合实例,正如我在演示文章中所做的,会成为拖累。你可以提前安排他们,例如,在充当与数据库交互上下文的类中,如下所示:

公共类ExpanseContext{公共IMongoDatabase ExpanseDb {get;私人集合;}公共imongocollection
         
          船只{得到;私人集合;}公共imongocollection
          
           字符get;private set;public expansecontext()expansedb=new mongoclient().getdatabase(“expansedatabase”);船只= ExpanseDb.GetCollection
           
            (“船”);字符=expansedb.getCollection
            
             (“船”);}}
            
           
          
         

用于插入文档的重构代码可读性更高:

private static void insertviacontext()var context=new expansecontext();var ship=新船name=“Agatha King”};context.ships.insertone(船舶);}

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

记录ef-core的内存操作和SQL操作自ef-core到来以来已经发展了几次。它利用了与ASP.NET核心使用的相同的底层功能。如果您使用的是ASP.NET核心,日志是内置的,为EF Core打开它并添加过滤非常简单。查看肖恩·威尔德茅斯的博客帖子ASP.NET核心中的EF核心日志记录.

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

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

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

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

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

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

obsolete(“此方法已过时,将在未来版本中删除。建议的替代方法是使用loggerfactory配置筛选,并使用consoleloggeroptions配置日志记录选项。“)

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

EF核心2.0和2.1逻辑

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

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

protected override void onconfiguring(dbContextOptionsBuilder OptionsBuilder)var connectionString=configurationManager.connectionStrings[“wpfdatabase”].toString();optionsBuilder .UseLoggerFactory(MyConsoleLoggerFactory) .EnableSensitiveDataLogging(true) .UseSqlServer(connectionString);}

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

EF Core 2.2逻辑

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

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

然后在选项builder的useLogging方法中调用getLoggerFactory():

选项builder.useLoggerFactory(getLoggerFactory())

文件包和参考

为了使用addconsole()方法,你还得用Microsoft.Extensions.Logging.Console先前的ConsoleLoggerProvider所在的包。然而,您不需要对名称空间使用using语句(就像您对ConsoleLoggerProvider所做的那样)。

EF核心配置和日志记录

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

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

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

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

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

然后我添加了一些测试,以避免在InMemory提供程序已经配置的情况下使用sqlite提供程序,因此,我用一个检查封装了UseSqlite方法,以查看是否已经配置了options builder。

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

但我的逻辑不起作用。我进行了一些迁移,但是他们突然不认识usesqlite方法。我已经用过很多次了。我花了一段时间才意识到发生了什么事。使用记录器工厂是一个配置

我只需要在isconfigure检查之后移动UseLoggerFactory逻辑,一切正常。

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

在ef core 2.1中定义定义查询

我不得不从我为杂志写的一篇太长的文章中剪下一些文字(发表时的链接),下面是一个简单的例子,使用新的toquery方法在ef core 2.1中创建一个定义查询(当前在预览版2中)。

ToQuery与new关联查询类型特性它允许您使用未映射到数据库中表的类型,因此这些类型不是真正的实体,不需要密钥,不跟踪更改。

我从一个包含这两个实体的简单模型开始,映射到我的dbContext中的表。

公共类团队{公共int TeamId {get;集合;}公共字符串名称get;集合;公共字符串TwitterAlias {get;集合;公共列表成员{get;集合;}}public class teammember public int teammemberid获取;集合;}公共字符串名称get;集合;}公共字符串角色{get;集合;公共int TeamId {get;集合;公共时间典型的通勤时间;私人集合;} public void CalculateCommuteTime (DateTime start,DateTime end) {typical altetime = end. minus (start);}

您需要预先定义用于定义查询的类型,我的名片上会有团队成员的名字和通常的通勤时间。

公共类团队通勤公共团队通勤(字符串名称,TimeSpan通勤时间)名称=名称;typicalcommutetime=通勤时间;}公共字符串名称get;集合;}公共时间跨度,典型时间间隔获取;集合;}}

您可以在OnModelBuilding中使用带有FromSql的原始sql或名为ToQuery的新方法中的LINQ查询直接定义查询。下面是将查询类型与定义查询和LINQ一起使用的示例:

模型生成器.query
          
           ()
          ToQuery(())>团队成员。选择(m=>新建团队通勤(m.name,m.典型时间)

使用在team通勤类中定义的查询,你现在可以在你的代码查询中使用它,例如:

var comments=context.query ()

请记住,不能在同一类型上同时定义toquery和toview映射。

新的多元化课程!EF核心2:入门

我最近在multuralsight.com上发表了我的第19门课程:实体框架核心2:入门yabo官网.

时长2小时40分钟,主要讲基础知识。

这是在Visual Studio 2017中使用EF Core 2.0.1。

未来计划:我已经开始学习一门中级课程,并准备继续学习其他课程,比如在EF Core 2.1发布时介绍它的特性(为了稳定,我将等到它拥有RTMd),以及其他高级主题。我还计划在macOS上使用VS代码做一个跨平台版本,因为这是我最近的爱好。

如果您不是Pluralsight订户,寄给我一张便条我可以给你30天的试用期,这样你就可以观看课程了。请注意:这项试验就像是成为订阅者的入门药。

这是目录课程:

引进一个新的,重量更轻的EF 32M 40S
简介和概述
什么是实体框架核心?yabo官网
您可以在其中构建和运行具有EF核心的应用程序
EF Core如何工作
从ef6到ef core到ef core的路径
EF核心2新功能
展望英孚核心2.1及更高版本
审查和资源

利用ef core__42M 36S创建数据模型和数据库
简介和概述
设置解决方案
使用NuGet包管理器添加EF Core
使用EF核心创建数据模型
指定数据提供程序和连接字符串
理解EF核心迁移
添加第一次迁移
检查您的第一次迁移
使用迁移编写脚本或直接创建数据库
在.NET Core中重新创建模型
添加多对多和一对一关系
对现有数据库进行反向工程
审查和资源

与您的EF核心数据模型34M 11S交互
简介和概述
获取EF核心以输出SQL日志
插入简单对象
保存时批处理命令
查询简单对象
在查询中筛选数据
更新简单对象
断开连接的更新
删除具有EF核心的对象
审查和资源

查询保存相关数据20M 49S
简介和概述
插入相关数据
快速加载相关数据
在查询中投影相关数据
使用相关数据筛选对象
修改相关数据
审查和资源

在应用程序中使用EF核心30M 52S
简介和概述
桌面或设备上的EF内核
桌面应用程序:Windows演示基础(WPF)
创建WPF应用程序
浏览WPF数据访问
ASP.NET核心MVC中的EF核心
将相关数据添加到MVC应用程序中
编写MVC应用程序的关系
审查和资源

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

我有两个人监视过我多元视野核心入门课程(即将加入EF Core 2: Getting Started课程)问同样的问题,起初我很困惑。

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

在EF6中,可以使用类库的迁移,而看不到exe项目。EF核心迁移可以从.NET框架或.NET核心项目运行,但不能从.NET标准运行。它需要一个运行时。一个常见的解决方法是,即使你还没有到你应用的UI部分,要将.NET核心控制台应用程序项目添加到解决方案中,将EF Core Design Nuget包添加到其中,并将其设置为启动项目。但是仍然可以在不添加虚拟项目的情况下实现这一点。

我们已经知道了多目标修复,它解决了您试图从. net标准库运行迁移时出现的错误。但即使有了固定装置,我们得到了神秘的虚无。

这个问题的答案隐藏在一个Github问题和EF核心文档中迁移文档的注释中。同样的解决方案解决了我在UWP应用程序中使用迁移时遇到的一个问题(同样,不是.NET核心或.NET框架),它使用单独的类库托管其dbContext。

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

我们与ef core 1.0一起使用的解决方案是从.NET标准库运行迁移到.NET标准库的多目标(因此您可以在一些地方使用该库).NET核心(以便运行迁移)。

这意味着更换

         
          
          
           netstandard20
          
         

具有

         
          
          
           netcoreapp2.0; netstandard2.0
          
         

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

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

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

         
          
           
         

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

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


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

dbcontext.add-in-efcore(和ddd-win)的另一个用例

如果您像我一样,按照域驱动的设计原则设计类,您可能会发现自己使用这样的代码来控制如何将对象添加到根实体中的集合中。

public class Samurai {public Samurai (string name): this() {name = name;}private samurai()u quotes=新列表
          
           ();}公共int Id {get;私人集合;}公共字符串名称{get;私人集合;}private readonly list _quotes=new list()private ienumerable quotes=>_quotes.tolist();{var newQuote=new Quote(quoteText,Id);_ QUOTES.ADD(新报价);}
          

我有一个完全封装的报价集合。添加新引用的唯一方法是通过AddQuote方法。你不能只叫samura.quotes.add(myquote)。

此外,因为我想控制开发人员如何与我的API交互,没有用于引号的DbSet。您必须通过context.samurais执行所有查询和更新。

一个很大的缺点是,如果我有一个新的报价,我知道武士的ID,我必须首先查询武士,然后使用AddQuote。这真让我心烦。我只想创建一个新的引用,输入武士的ID值并保存。这需要原始SQL或DbSet .我不喜欢这两种选择。在本例和DbSet中,原始SQL是一种攻击 将打开我的API以防止潜在的误用。

今天早上我躺在床上思考这个问题(承认吧,这是你醒来后做的第一件事,同样,我有个主意。

在EF核心中,现在,我们可以直接将对象添加到上下文中,而不需要经过DbSet。上下文可以找出实体所属的dbset,并将正确的信息应用到变更跟踪器。我以为这对打电话很方便

myContext.addRange(个人对象,accountobjectB,productObjectC);

尽管我还没有遇到一个很好的利用它的用例。

我想到的是,如果dbContext.add是使用反射,也许英孚核心能找到一个私有的DbSet。

所以我在dbContext类中添加了一个私有dbset:

私人DbSet
          
           引用{得到;集合;}
          
并尝试了此代码(注意我正在使用context.add,不是context.quotes.add):
静态void AddQuoteToSamurai () {using (var context =newSamuraiContext ()) {var quote=newQuote("Voila",1);添加(引用);context.saveChanges();}
效果不错!但这还没有完成。我违反了确保只有聚合根才能管理引用的规则。所以这是“危险的”从我的DDD角度看代码。然而,我很高兴知道EF Core将支持这种功能。
目前,samurai.addQuote没有要对报价执行的任何附加逻辑。如果我加上一个“删除关键词”呢?报价单添加前的规则?
public void addquote(字符串QuoteText)utilities.removeBadWords(QuoteText);var newQuote = new引用(quoteText、身份证);_ QUOTES.ADD(新报价);}
现在我有一个重要的理由使用武士来做这件事。我可以补充一点,静态addQuote方法,也接受int。因为它是静态的,这是一个传递方法。
公共静态引用AddQuote(string quoteText,int samuraiId){实用程序。removebadwords (quoteText);var newquote=newquote(quotext,samuraiid);返回newQuote;}

这是有效的,现在我不需要一个武士的例子来使用它:

staticvoid addquotetosamurai()使用(var context=newsamuraicontext())context.add(samurai.addquote(“static voila”,1));context.saveChanges();}

我担心的一件事是,如果我有一个武士的例子,并试图用它来添加一个引用到另一个武士。这将破坏聚合根…它的工作只是管理自己的引用。它不应该知道其他的武士。

但是。net保护了我。我不能从Samurai实例中调用静态方法。

我仍然认为从DDD的角度来看,有一点代码味道是关于静态的,在聚合根中传递方法,因此必须对其进行调查(或等待我的注释中出现任何不满意的ddder)。但现在我很高兴我可以避免为了完成这项任务而去查询武士的实例。

首次进入.NET核心2.0

我必须从某个地方开始,所以我开始了wtih超级婴儿步骤。下载.NET核心2夜间版本并尝试创建一个简单的控制台应用程序。我立刻悲惨地失败了。的原因吗?夜色中的建筑已经跃过鲨鱼!他们正在研究2.1.0,我不小心抓住了它。这对我来说有点太血腥了。

有一个码头工人形象你可以很容易地使用但我想试试CLI,VS代码和Visual Studio。所以我想把钻头安装在我的机器上。

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

确保NuGet知道在哪里可以找到包

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

在Mac上,位于[user]/.nuget/nuget的全局配置文件。这是一张截图,如果像我一样,macOS并不是您的主要平台,您仍然在与这些事情做斗争。

2017年6月11日\12-32-15.jpg

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

我有一个链接指向配置NuGet行为“医生,当我忘记在哪里能找到它的时候。

我在PackageSources部分添加了这两个键:


           
           

现在是创建项目的时候了

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

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

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

NETCORE2控制台
netstandard2lib

然后我进入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,我喜欢打电话
网络还原
明确。(控制狂)
如果恢复正确,然后验证的下一步是
dotnet构建
希望这也不会给你带来错误。这是不应该的。
最后,
dotnet运行
会导致呕吐吗
你好世界!
现在我知道它起作用了。有点傻,但我想在浪费时间写一堆无法运行的代码之前验证一下,因为我甚至没有正确安装。net Core。
另一个有趣的地方是dotnet new console创建了哪些文件。
如果我把它们打开比较容易看到 Visual Studio代码我可以打字吗
代码。
只有2个文件。包含项目元数据和程序文件的csproj。csproj文件说目标框架是netcoreapp2.0。

2017年6月11日

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

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

          
           
          
再次运行dotnet还原和dotnet build将有助于识别您是否有输入错误。我经常这样做。
现在,我将修改program.cs文件,并从我的库中调用输出calling hiya方法的结果:
2017 - 06 - 11 - _14 - 31 - 39

然后返回到我的终端窗口(尽管我也可以在vs code的内置终端内完成)。我dotnet构建库,然后切换到console文件夹。重建并运行它,就这样

γNETCORE2控制台dotnet运行

你好世界!

为什么,你好!

γNETCORE2控制台

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

我也在我的Windows电脑上重复了这一切。这不仅让我知道我可以在那里使用这个版本的.NET核心,但我也将在带有.NET核心2.0预览的Visual Studio中做一些工作。

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