在Azure上运行时迁移EF Core的快速技巧

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

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

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

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

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

发布一个包含VS2017秘密的图像Docker容器,并在Azure上运行它

(提前写,但在5月2日相关文章最终出版时出版。)

我刚刚完成了一个由三部分组成的系列文章,内容是构建一个容器化的ASP.NET核心API,该API使用EF核心进行数据持久化。所有这些都是在VS2017中完成的,我利用了Docker的VS2017工具。

文章系列将在四月出版,MSDN杂志5、6月刊。

第1部分:一个Docker容器化应用程序中的EF内核,2019年4月

第2部分:一个Docker容器化应用程序中的EF内核,2019年5月

但我没有足够的空间来完成部署我编写的应用程序的重要任务,虽然我很努力去做。好吧,部署非常简单,但是为了处理存储用于连接到我的Azure SQL数据库的密码,还有一些新的步骤需要完成。我将在这篇博文中介绍这些步骤。

我的API使用EF Core,目标是一个Azure SQL数据库。无论我在本地调试IIS还是Kestrel,在Docker容器内进行本地调试或从服务器或云运行应用程序,我总是可以访问那个数据库。

这意味着我有一个连接字符串要处理,但我想保持密码的秘密。

解的结构在这里。我的ASP.NET核心API项目是DataApidocker。因为我使用Docker工具添加容器编排,我在docker-compose解决方案中有另一个文件夹。

形象

我将在本文的第2部分(2019年5月的一期)中详细介绍,但底线是在docker-compose.yml文件中使用docker环境变量。

版本:“3.4”

服务:
dataapidocker:
图片:$ {DOCKER_REGISTRY -} dataapidocker
构建:
背景:。
dockerfile:dataapidocker/dockerfile
环境:
——DB_PW

在环境映射中,我有一个序列项,我在其中定义db_pw键,但不包括值。因为那里没有价值,Docker将查看主机的环境变量。因为我只是在调试,我在系统上用密码值创建了一个临时环境变量,当我从VS2017调试或运行应用程序时,将找到密码变量。该环境变量被传递到正在运行的容器中,我的应用程序具有读取该变量的代码,并将该密码包含在连接字符串中。

所以它是独立的,漂亮整洁。

将图像发布到Azure的ACI注册表

一旦你的应用程序运行,是时候发布它了。但我们用的是Docker,所以你不会发布这个应用程序,但是可以为你运行应用程序的docker图像。Docker工具也会对此有所帮助。

右键单击项目并选择“发布”。

形象

然后您将要创建发布配置文件。这个概要文件的一部分是选择在哪里发布图像。这里你有选择。我有一个VIsual Studio订阅,如果我想的话,可以将它发布到Azure容器注册中心或Docker Hub或其他注册中心。

形象

我写这篇博文的目的是把图片放到Azure容器注册表中,所以这是我的选择。您可以在azure帐户中拥有多个容器注册中心。您可以在一个注册表中存储任意数量的图像。好吧,可能会有技术或财政上的限制,但关键是,一个注册表中可以有多个图像。我不是来这里为如何管理Azure财务提供建议的,只是如何完成任务。

这是我让发布工具为我创建的注册表的概述页面。我圈出了链接,以查看可以访问您的图像的存储库。

形象

您可能有不同版本的特定图像,因此每个“集”是一个不同的存储库。我有三个储存库,我一直在试验。

形象

DataAPI只有一个图像,发布工具自动将其标记为“最新”给我。我可以在不同的标签下有其他版本。

回到Visual Studio,在浏览了发布工具关于创建新存储库的问题之后,最后一步是发布,它将构建映像并将其推到目标存储库。请记住,您希望将VS2017设置为运行版本构建,不是调试版本。

如果这是您第一次将此图像推送到存储库,该工具还将推送应用程序DockerFile中列出的ASP.NET核心SDK和运行时映像。

我很惊讶看到这个,想知道为什么Azure不只是从Docker Hub上获取它们,为什么我要直接上传那些大文件。当然,我在推特上表达了我的困惑:

故事还有很多,但这超出了我在这里的目标范围。

这个注册表的一个很酷的特性是,您可以右键单击并运行一个图像。如果你不想安排一些图像,这很好,而且与我的情况相匹配。这个映像是独立运行的。

右键单击图像并选择“运行实例”。Azure将创建一个容器并将其作为Azure容器实例。尽管首先需要为实例定义规范。

形象

这很神奇,因为如果容器是一个简单的应用程序,您不需要创建和管理虚拟机来运行它。

容器实例的环境变量呢?

实例将运行,但是需要从Azure SQL数据库读取的杂志控制器将失败,因为我们没有提供容器期望通过主机的环境变量提供的密码。对于我的图像,右键单击并运行还不够。

我在这里读了很多书,研究和实验,直到我找到解决方案。(请记住,如果我在自己设计的虚拟机上运行这个程序,当您手动调用docker run时,您可以直接将变量传递进来。)

有两种方法可以为容器实例提供环境变量。

一,通过门户网站,表示不是右键单击图像,您需要首先在Azure中创建一个新的容器实例并指向该映像。此路径允许您在配置中最多分配3个环境变量:
形象

使用动态变量传递到容器中

我将进行第一次传递,创建一个动态变量以传递给environmentvariable。然后我将向您展示如何使用Azure密钥库

EnvironmentVariable需要一个散列表。

创建一个新的变量(我将称之为envvars,以纪念我学习到的资源),并分配一个键值对:

$envvars=@'db_pw'='eiluj'

另一个棘手的部分是提供访问注册表中的映像的凭据。在使用门户创建容器时,我们不必这样做,因为我们已经提供了它们。但现在我需要提供它们。

您需要存储库中的用户名和密码:

然后可以使用PowerShell从密码创建一个安全字符串,然后使用该安全字符串和用户名创建PowerShell凭据对象。

提示:如果您有多个订阅,确保指向的是目标资源组所在的位置。

提示:在云shell中可以做的一件很酷的事情是,键入dir列出您的订阅,然后使用cd进入正确的订阅!结帐PowerShell云外壳快速启动有关详细信息,

小贴士:如果像我一样,为了体验因果关系,你把数据库搞得一团糟,记住,在我的示例代码中,数据库在应用程序启动时迁移。在容器中包含它的情况下,这意味着当容器实例运行时。如果你运行容器,然后删除数据库,在容器再次旋转之前,您不会再次看到数据库。停止和重新启动具有相同的效果。当然这只是为了测试一下,不生产!再一次,有件事让我困了一个多小时,直到我有了一个“啊哈”的时刻。

创建一个密钥库并添加我的密码

关于我即将到来的交付敏捷会议的视频

下周我将在敏捷联盟技术会议上发言,万博体育苹果下载在田纳西州纳什维尔发布敏捷。我的演讲题目是“使用Docker开发和测试数据库的敏捷性”。我和田径运动主席理查德·血清素谈了这个话题。

朱莉·勒曼:敏捷2019年理查德·瑟瑞特采访万博体育平台敏捷联盟Vimeo

链接到我最近的DDD+EFCore内容

是时候将我创建的各种文章和视频聚合在一起了,这些文章和视频充满了关于EF Core支持域模型直接映射到关系数据库的经验教训:


关于docker compose中env文件的一个小教训

我最近和docker一起工作了很长一段时间,学习学习。我写了一个由三部分组成的系列MSDN Mag数据点列那将在四月份推出,2019年5月和6月发行。我还有另一篇YUGE博客文章,我将在五月的文章中发表。我正在研究其他的。

我研究了Docker环境变量以及将它们提供给Docker映像或容器的不同方法。

我的docker compose文件引用了一个名为db_pw的环境变量,但没有指定其值。

dataapidocker:
图片:$ {DOCKER_REGISTRY -} dataapidocker
构建:
背景:。
dockerfile:dataapidocker/dockerfile
环境:
-DPY-PW

Docker将从主机读取环境变量以发现该值。

但这是一种痛苦。我没有将DB_PW永久地存储在我的开发机器上,因此必须经常设置它。EltonStoneman(来自Docker)说我真的应该考虑使用Docker env文件特性。这允许您在环境文件中设置变量,并让Docker编写从中读取的文件。我可以把这个特殊的文件放在源代码控制之外。(我总是担心!)

我首先跟踪显示使用名为anything.env文件的文档。我创建了一个名为hush-hush.env的文件,在其中我指定了变量。这是文件的完整内容:

db_pw=大秘密

然后在Docker Compose中,在服务,env_文件标记允许您指向它。您甚至可以删除yml文件中的environment标记。

dataapidocker:
图片:$ {DOCKER_REGISTRY -} dataapidocker
构建:
背景:。
dockerfile:dataapidocker/dockerfile
文件:
- HuSH HuS.Env

这很管用。我的应用程序能够在代码中发现环境变量。

但是后来我改进了我的解决方案,为我的数据库使用了另一个容器。主容器依赖于新的MSSQL容器。mssql容器要求我将数据库密码作为环境变量传入。由于DB_PW已经存在,通过替换(通过花括号),我可以很容易地做到这一点。这是新的Docker撰写文件:

版本:“3.4”
服务:
dataapidocker:
图片:$ {DOCKER_REGISTRY -} dataapidocker
构建:
背景:。
dockerfile:dataapidocker/dockerfile
文件:
- HuSH HuS.Env
depends_on:
- - - - - - db
分贝:
图片:mcr.microsoft.com/mssql/server
卷:
- mssql-server-julie-data: / var / opt /该软件/数据
环境:
SA_PASSWORD:“$ {DB_PW}”
接受“Y”
端口:
-“1433∶1433”
卷:
mssql-server-julie-data: {}

这里有一个操作顺序问题。当我构建docker-compose文件时,它抱怨DB_PW不可用,我的应用程序失败。DB服务未获取my hush-hush.env文件的内容。我尝试了很多事情,例如,将env_文件添加到db服务。最后,这是我学到的。

替换使用要求在Docker Compose中定义db_pw变量。我把它重新添加到主要服务中,但它并没有从hush-hush.env那里获得价值。

但是您可以有一个没有名称的.env文件。扩展名*是文件的全名。Docker-compose将尽早读取该文件,并提供从.env文件到声明的DB_PW的值。然后所有的碎片都落在了原位。mssql容器以DB_PW的值作为其环境变量展开。我的应用程序代码能够读取Docker为自己的任务传递到运行容器中的环境变量。

最后一个docker-compose.yml文件如下:

版本:“3.4”
服务:
dataapidocker:
图片:$ {DOCKER_REGISTRY -} dataapidocker
构建:
背景:。
dockerfile:dataapidocker/dockerfile
环境:
-DPY-PW
depends_on:
- - - - - - db
分贝:
图片:mcr.microsoft.com/mssql/server
卷:
- mssql-server-julie-data: / var / opt /该软件/数据
环境:
SA_PASSWORD:“$ {DB_PW}”
接受“Y”
端口:
-“1433∶1433”
卷:
mssql-server-julie-data: {}

它依赖于一个名为"。env"的文件定义了变量键值对(与上面的hush-hush.env相同)。

db_pw=大秘密

资源:
https://docs.docker.com/compose/environment-variables网站/

宣布:深入EF核心2天研讨会

6月17日至18日,与我一起在伦敦对实体框架核心进行为期两天的深入研究。万博体育平台

这是一个新添加的技能物质课程目录。因为这是一门新课程,我们期待得到关于提议的主题列表的反馈。如果你有兴趣参加,您的输入将有所帮助。

主题列表是不是太长了2天?它是否涉及到你想在高级课堂上学习的内容?你可以提供反馈课程描述页面

第1天:利用高级功能

  • EF核心与EF6差异的高水平回顾
  • 实现日志记录来捕获EF Core的数据库和内存中的活动。了解要捕获的不同类型的日志数据
  • 学习各种播种方法,如通过数据库脚本,代码或使用ef core 2.1中引入的基于迁移的播种。您还将了解每种方法何时适用。
  • 在开发、源代码控制和部署期间使用迁移
  • 集成测试您的EF核心代码

第2天:软件架构中的EF核心

  • 关于存储库的大辩论:用于公开EF核心的存储库模式/通用存储库的利弊
  • 设计数据层/ api
  • 了解复杂的映射约定,并使用Fluent API使用自定义映射对其进行补充。
  • 性能设计
  • *附加主题*如果所有模块都涵盖了,您还将在Azure函数中查看ef core,并在Azure Cosmos DB中查看ef core(给定足够的时间)

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

在MSDN杂志2019年2月刊(利用Azure Cosmos DB的API对MongoDB进行多模型性能的研究),我的Data Points专栏探索了如何使用Azure Cosmos DB的MongoDB模型mongocsharpdriver。我首先处理MongoDB的本地实例,然后处理Azure实例。但是这个专栏有点长,所以我剪掉了一些无关的部分。所以我把它们放在这里,并链接到这篇文章的博客文章。

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

将集合键入bsondocument

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

var coll=db.getcollection(变量coll=db.getcollection)
         
          (“船舶”);coll.insertone(ship.tobsondocument());
         

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

var coll=db.getcollection(变量coll=db.getcollection)
         
          (“船舶”);var ships=coll.asqueryable().oftype
          
           ()var dships=coll.asqueryable().oftype
           
            ()
           
          
         

封装MongoClient,数据库和收集

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

公共类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 = new ship {Name = "Agatha King"};context.ships.insertone(船舶);}

在Visual Studio代码中构建基于项目的Azure函数

我已经使用了一段时间的Visual Studio代码的Azure函数,它们继续以很好的方式发展。最近的一次换班让我陷入了一个循环,所以我想我会为那些还没有开始的人记录一些。我还应该指出,在过去一年左右的时间里,我一直专注于用JavaScript编写函数,因为我喜欢把事情搞混一点,这也使得与不以.NET为中心的开发人员共享Azure函数更加容易。

我也写过关于在msdn杂志上用vs代码创建Azure函数的文章,但同样,自从我写了这篇文章以来,情况已经发生了变化。我已经使用版本2的api有一段时间了,所以我不打算讨论(好吧,写)关于从v1到v2的变化,以及使用Azure函数扩展的体验的变化。

另外值得注意的是,Azure功能团队实际上建议使用Visual Studio为JavaScript构建基于C的应用程序和VS代码。但是我经常在我的MacBook上,并且喜欢使用VS代码,所以我无论如何都要用c#沿着这条路走下去。

在对文档进行了足够多次的重新访问后,最终发现了一些关键信息,我意识到,随着与C合作的扩展,体验发生了变化。以前,我曾经使用过C脚本函数(.csx),这与您直接在门户中工作时使用的相同。但是扩展模板现在驱动您使用c#项目函数,这是一个很大的区别。脚本函数更像是javascript函数。它们依赖于手动创建的function.json文件来定义绑定,并可以基于绑定安装适当的扩展包。CSX文件在运行时编译。有了C类库,您可以像开发其他C类库一样进行开发——安装相关的包,然后使用属性将方法标识为Azure函数和触发器,输入和输出绑定。编译库时,Azure函数工具将为您生成一个被部署的function.json文件。

因为我习惯用JavaScript或c#脚本路径创建函数,使用C类库的Azure函数扩展的新默认值确实让我陷入了一个循环。因此,我决定用文档记录在这个工作流程中行走,因为我必须学习它。我想我还是更喜欢重量较轻的C脚本(.csx)或JavaScript流,但这可能与我在许多情况下对vs代码的偏好相一致,而不是Visual Studio。

正在准备Visual Studio代码

所以首先要做的是:您需要安装Azure的功能Azure帐户扩展到VS代码,Azure函数扩展依赖于Azure函数核心工具。扩展安装说明将帮助您获得所需的所有信息,扩展会检查更新并提示您根据需要更新这些工具。事实上,我昨晚收到这个提示。2019年1月16日\u 09-28-10.png

安装了扩展之后,现在是时候创建一个函数应用程序项目了。您应该已经创建了一个文件夹来存放您的项目,您也可以用VS代码打开它。我的名字叫AzureFunctionProj。

然后你可以点击“创建新项目”在功能栏上的图标(当您将鼠标悬停在功能栏上时,图标会出现),用于在文件夹中创建一个新的功能应用程序项目。

2019 - 01 - 17 - _18 - 11 - 39. png

工作流的此部分未更改。

  1. 它将要求您指向一个文件夹,打开的文件夹应该作为默认选择。
  2. 然后它会让你选择一种你将在应用程序中使用的语言。从选项(c#,JavaScriptPython(仍然是预览版)和Java(也是预览版),我将选择c#。

因此,一个新的。net核心项目将使用模板创建,您将在文件夹资源管理器中看到以下内容:

2019-01-17_18-19-58.png

azurefunctionproj文件夹中的所有这些文件都是由模板创建的。最重要的是csproj文件,我在其中突出显示了一些最相关的设置。

         
          
           
            NETCOREAPP2.1
           
           
            
             v2
            
          
          
           
            
          
          
           
            
             PreserveNewest
            
           
           
            
             PreserveNewest
            
            
             从来没有
            
           
          
         

在函数应用程序中创建一个函数,事情就大不一样了。

像往常一样,以"add a function"开头图标2019 - 01 - 17 - _18 - 11 - 39 copy.png

第一步很熟悉,选择哪个文件夹有函数应用程序,函数应该在:

2019-01-17_22-06-37.png

我会选择azurefunctionproj。

然后有许多触发器模板可供选择,下面的三个选项更有趣:

2019 - 01 - 17 - _16 - 42 - 25. png首先是项目运行时,我肯定想要v2(“~2”)。你可以在函数应用中为不同的函数使用不同的语言。这显示了我已经选择的默认值:c。最后,触发器模板列表过滤为“已验证”。

您可以通过单击这些选项来更改它们。

过滤器选项已验证,核心和所有。核心和所有当前显示相同的列表,其中包括一些额外的预览触发器:DurableFunctionsOrchestration,SendGrid,事件hubtrigger和iothubtrigger。

2019-01-17_16-43-20.png

过去我在。net核心函数应用程序中创建JavaScript函数,但现在我将继续使用c#,因为这是真正让我吃惊的地方。我将选择HttpTrigger,然后提示我提供一个名称。我只留下默认值:httptriggercsharp。然后要求我为将要创建的类提供一个名称空间名称。默认设置是“Company.Project”。我将它更改为FunctionTests.HttpTest1。要收集的最后一点信息是,您需要为函数选择安全性。选项中,我将选择匿名,因为它是一个演示,我不想处理凭证。

就是这样。将创建函数。

更多的类库项目差异

我过去的经验告诉我,在app function文件夹中创建一个新文件夹,里面有函数名,将是函数的类文件和包含绑定配置的function.json文件。类文件在那里(虽然不在它自己的文件夹中)。但是没有function.json文件。对我来说,运行方法上的FunctionName属性和运行方法签名中的HttpRequest上的HttpTrigger属性也是有趣的和新的。也,我不习惯在使用csx脚本时使用所有这些语句。2019 - 01 - 19 - _15 - 16 - 45. png

在建设项目时,.NET核心读取该属性并构建一个进入bin文件夹进行部署的function.json。2019 - 01 - 17 - _22 - 38 - 03. png

但这不仅仅是熟悉的绑定。注意到generatedBy,配置源,scriptFile和entryPoint标记。

所以第一次装订,httpTrigger绑定,我看起来很熟悉。该函数将响应httpTrigger。

您可以通过运行或调试来测试这个默认值。运行,你可以使用VS Code的CTRL-F5键盘组合,如果您喜欢使用CLI,使用azure函数cli命令:

func主机开始

这将运行该函数并提供一个URL来尝试。模板“赌注”方法的编写目的是接受主体中的查询参数或JSON。我将使用一个查询参数:

http://localhost:7071/api/HttpTriggerCSharp?name=Julie

以及浏览器输出

2019-01-19_15-57-04.png

将输出绑定添加到
Azure宇宙DB

如果我想添加一个输出绑定呢?我习惯通过编辑function.json来实现这一点。但是由于我在属性定义绑定的路径上,我会这样添加绑定。让我们为AzureCosmosDB添加一个输出绑定。这样,该函数将响应HTTP请求并将一些数据插入Cosmos DB数据库。我已经有一个Azure Cosmos DB账号了,因此,我将定义它来针对现有帐户中的新数据库中的新集合。

为了使用与Azure Cosmos DB绑定的工作,我需要将相关包添加到我的项目中。因为我正在使用C类库构建我的函数,我可以这样做,就像我对任何其他Nuget包…直接添加到csproj或添加包与dotnet核心CLI:

但是现在我只是编写一个C类库,这样我就可以使用dotnet cli添加包,或者手动将它添加到.csproj中。我会使用CLI:

dotnet添加包microsoft.azure.webjobs.extensions.cosmossdb--版本3.0.3

注意,如果我使用javascript或c脚本构建函数,我需要使用CLI (func extensions install -p)工具注册这个包packagename)。

现在这个包在csproj中:

          
           
            
           
          
恢复后,我可以添加输出绑定。目前默认函数是异步的,您不能向异步方法添加参数。返回值是一个选项。见 https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings#using-the-function-return-value获取详细信息。ICollector或IAsyncCollector是另一个( https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#writing-multiple-output-values)。
但我要只是使run方法同步,并创建一个输出参数。就像触发器绑定参数一样,我需要向输出参数添加一个属性来指定绑定。我还提供数据库和集合名称的参数,具有到数据库帐户的连接字符串的设置的名称,以及最后一个确保在需要时创建数据库和集合的设置。
[FunctionName("HttpTriggerCSharp")]公共静态ActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous,“得到”,“文章”,HttpRequest req,[CosmosDB(数据库名:“CSharpDatabase”,collectionName:“CSharpCollection”,connectionStringsetting=“mycosmosdbconnection”,CreateIfNotExists=true)] out dynamic document,ILogger实例日志)
我添加了mycosmosdbconnection,它是在local.settings.json文件中定义的:
“IsEncrypted”:假,“values”:“azurewebjobsstorage”:“”,“functions_worker_runtime”:“dotnet”,“mycosmosdbconnection”:“这是连接字符串的位置“}
请注意,如果使用一个Azure Cosmos DB触发器创建一个新函数,工具会提示您输入所有相关的数据库信息,在函数代码中包含一个属性,并将其添加到function.json中。
现在只有最后一块拼图了。该函数希望我为文档变量提供一个值,然后绑定将该值插入数据库。下面是完整的类清单,其中用红色突出显示了用名称和添加属性填充文档的一行。函数和绑定将完成剩下的所有工作。
使用系统;使用Microsoft.AspNetCore.Mvc;使用Microsoft.Azure.WebJobs;使用Microsoft.Azure.WebJobs.Extensions.Http;使用Microsoft.AspNetCore.Http;使用Microsoft.Extensions.Logging;命名空间函数tests.httptest1公共静态类httptriggercsharp[函数名(“httptriggercsharp”)]公共静态操作结果运行([httptrigger(authorizationlevel.anonymous,“得到”,“文章”,HttpRequest req,[CosmosDB(数据库名:“CSharpDatabase”,collectionName:“CSharpCollection”,connectionStringsetting=“mycosmosdbconnection”,CreateIfNotExists=true)] out dynamic document,ilogger log)log.loginformation(“C HTTP触发器函数处理了一个请求”);string name = req.Query["name"];document=新建name=名称,添加=datetime.now;返回名称!= NULL?(actionresult)新的OkObjectResult($你好,name”):new badRequestObjectResult(“请在查询字符串上传递名称”);} }
根据我之前手工配置function.json的经验,我以为建好房子后,bin文件夹中包含cosmossdb输出绑定信息的function.json,但没有。再一次,这是由于JavaScript/ c#脚本函数和c#库函数之间的差异造成的。
在vs代码中,我可以运行或调试函数。调试是F5或调试图标。运行,没有调试,您可以使用CTRL-F5或工具CLI命令:
func主机开始
当使用CLI命令时,我在测试中发现我使用的版本似乎需要我运行 清洁网首先要让它成功。ctrl-f5为您完成这一步。我在一个预先存在的GitHub问题中记录了这一点。你们可以读到 在这里
在官方文档中有很多有用的信息。我所倚重的两件事是: