Azure Cosmos DB (二) SQL API 操做

一,引言

  還記得國慶期間,咱們學習了一下關於Azure Cosmos DB 的一些基礎知識以及Azure Cosmos DB 的幾種支持數據庫類型。今天就開始分享一些實戰操做,如何經過Azure Portal 建立 Cosmos DB,以及在實際項目中如何經過代碼操做數據庫。html

  今天要演示的是 Core(SQL) 核心,SQL API 是具備豐富的SQL查詢功能的無架構 JSON 數據庫引擎,它是以 json 形式的文檔數據庫。同時微軟提供了對應的 EF 的操做包 ----- Microsoft.EntityFrameworkCore.Cosmos,使得咱們很輕鬆的使用原有EF操做數據庫的模式進行操做 Cosmos DB。git

注意這裏使用的  Microsoft.EntityFrameworkCore.Cosmos 僅適用於 Azure Cosmos DB 的 SQL APIgithub

--------------------我是分割線--------------------web

1,Azure Cosmos DB (一) 入門介紹

2,Azure Cosmos DB (二) SQL API 操做

二,正文

1, 建立Azure Cosmos DB 

在Azure portal 中點擊 「+ 建立資源」,在搜索框中輸入 「Azure Cosmos DB」 進行搜索數據庫

點擊 「Create」 ,進行開始建立json

Resource Group:"Web_Test_DB_RG"架構

Account Name:"cnbateblogwebcosmosdb"app

API 選擇:Core(SQL)ide

Capacity mode 選擇默認 :「Provisioned throughtput」(預配的吞吐量)學習

其餘都選擇默認。點擊 「Review + create」 進行建立前的預校驗。

使用Azure Cosmos DB 免費層時,將在帳戶中免費得到 400 RU/秒和 5GB 的存儲。每一個訂閱最多可對一個帳戶啓用免費層。預計每一個帳戶每個月有24美圓的折扣。

能夠看到驗證提示 「Validation Sucess」,點擊 」Create「 進行建立

等待幾分鐘後,咱們能夠在 "Web_Test_DB_RG" 中找到剛剛建立好的叫 」cnbateblogwebcosmosdb「 的 Cosmos DB 了

點擊進去,找到 Data Explorer ,點擊 」New Database「 新建數據庫

或者點擊 」New Container「 旁邊的小箭頭,進行下拉選擇建立新的數據庫。

Database id:」CNBATEBLOGWEB

點擊 「OK」 ,進行建立

能夠看到 「CNBATEBLOGWEB」 的 Database 已建立好了。

2,項目添加對Cosmos DB 的依賴包

2.1,安裝 「Microsoft.EntityFrameworkCore」,「Microsoft.EntityFrameworkCore.Cosmos

使用程序包管理控制檯進行安裝

Install-Package Microsoft.EntityFrameworkCore -Version 3.1.8
Install-Package Microsoft.EntityFrameworkCore.Cosmos -Version 3.1.8

2.2,要建立所需的容器並插入種子數據

配置環境,此時須要cosmosDB 的 Endpoint,Key,DatabaseName

圖中對應的 URL=》Endpoint,PRIMARK KEY=》Key,

上面步驟中建立的叫 「CNBATEBLOGWEB」 的咱們須要的DatabaseName

整理好剛纔須要的三個參數,添加到項目的配置文件中 也就是 appsettings.json 文件中

建立UserModel 實體,UserContext,重寫 OnConfiguring 方法,調用UseCosmos 方法

重寫 「OnModelCreating」 建立數據數據映射關係

ConfigrueServices「 中添加對 「UserContext」 的依賴注入

生產種子數據,先將已有的數據庫進行刪除操做,再進行添加操做以及生成種子數據

 完整代碼

 1 public class UserContext : DbContext
 2     {
 3         public UserContext(DbContextOptions<UserContext> options) : base(options)
 4         {
 5 
 6         }
 7 
 8         public DbSet<UserModel> Users { get; set; }
 9 
10         /// <summary>
11         /// 重寫鏈接數據庫
12         /// </summary>
13         /// <param name="optionsBuilder"></param>
14         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
15         {
16             // 從 appsetting.json 中獲取配置信息
17             var config = new ConfigurationBuilder()
18                 .SetBasePath(Directory.GetCurrentDirectory())
19                 .AddJsonFile("appsettings.json")
20                 .Build();
21 
22             // 定義要使用的數據庫
23             optionsBuilder.UseCosmos(Appsettings.app("CosmosDB", "Endpoint"), Appsettings.app("CosmosDB", "Key"), Appsettings.app("CosmosDB", "DataBase"));
24         }
25 
26         protected override void OnModelCreating(ModelBuilder modelBuilder)
27         {
28             //針對於HasData限制(即便主鍵是由數據庫生成的自動增加),也須要指定主鍵 
29 
30             //調用EnsureCreated方法只針對與添加數據有效,可是數據庫若是有數據的話,
31             //也就是對數據更改將無效
32             Console.WriteLine("**********UserModel表開始初始化數據**********");
33             #region 數據庫數據映射
34             modelBuilder.Entity<UserModel>().HasData(
35                    //new Blog{Id=1,Name="DDD領域驅動模型"},
36                    new UserModel { Id = 1, Name = "EntityFramework Core 3.1.1" },
37                   new UserModel { Id = 2, Name = "EntityFramework Core 3.1.6" });
38 
39             #endregion
40 
41 
42         }
43 
44     }
UserContext.cs
 1 public class UserModel
 2     {
 3         public int Id { get; set; }
 4 
 5         public string Name { get; set; }
 6 
 7         public int Age { get; set; }
 8 
 9         public string Address { get; set; }
10 
11         public string Remark { get; set; }
12     }
UserModel.cs
 1    /// <summary>
 2     /// appsettings.json操做類
 3     /// </summary>
 4     public class Appsettings
 5     {
 6         static IConfiguration Configuration { get; set; }
 7         static string contentPath { get; set; }
 8 
 9         public Appsettings(string contentPath)
10         {
11             string Path = "appsettings.json";
12 
13 
14             //若是你把配置文件 是 根據環境變量來分開了,能夠這樣寫
15             //string Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json";
16 
17             //var contentPath = env.ContentRootPath;
18             Configuration = new ConfigurationBuilder()
19                .SetBasePath(contentPath)
20                .Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true })//這樣的話,能夠直接讀目錄裏的json文件,而不是 bin 文件夾下的,因此不用修改複製屬性
21                .Build();
22         }
23 
24         /// <summary>
25         /// 封裝要操做的字符
26         /// </summary>
27         /// <param name="sections"></param>
28         /// <returns></returns>
29         public static string app(params string[] sections)
30         {
31             try
32             {
33                 var val = string.Empty;
34                 for (int i = 0; i < sections.Length; i++)
35                 {
36                     val += sections[i] + ":";
37                 }
38 
39                 return Configuration[val.TrimEnd(':')];
40             }
41             catch (Exception)
42             {
43                 return "";
44             }
45         }
46     }
Appsettings.json
 1     public class Program
 2     {
 3         public static void Main(string[] args)
 4         {
 5             var host = CreateHostBuilder(args).Build();
 6             // 建立可用於解析做用域服務的新 Microsoft.Extensions.DependencyInjection.IServiceScope。
 7             using (var scope = host.Services.CreateScope())
 8             {
 9                 var services = scope.ServiceProvider;
10                 var loggerFactory = services.GetRequiredService<ILoggerFactory>();
11                 var env = services.GetRequiredService<IWebHostEnvironment>();
12                 if (env.IsDevelopment())
13                 {
14                     try
15                     {
16                         // 從 system.IServicec提供程序獲取 T 類型的服務。
17                         var context = services.GetRequiredService<UserContext>();
18                         
19                         context.Database.EnsureDeleted();
20                         Console.WriteLine("**********開始初始化數據**********");
21                         context.Database.EnsureCreated();
22 
23                     }
24                     catch (Exception e)
25                     {
26                         var logger = loggerFactory.CreateLogger<Program>();
27                         logger.LogError(e, "Error occured seeding the Database.");
28                     }
29                 }
30             }
31 
32             // 運行 web 應用程序並阻止調用線程, 直到主機關閉。
33             // 建立完 WebHost 以後,便調用它的 Run 方法,而 Run 方法會去調用 WebHost 的 StartAsync 方法
34             // 將Initialize方法建立的Application管道傳入以供處理消息
35             // 執行HostedServiceExecutor.StartAsync方法
36 
37             host.Run();
38         }
39 
40         public static IHostBuilder CreateHostBuilder(string[] args) =>
41             Host.CreateDefaultBuilder(args)
42                 .ConfigureWebHostDefaults(webBuilder =>
43                 {
44                     webBuilder
45                     .UseUrls("http://*:9001")
46                     .UseStartup<Startup>();
47                 });
48     }
Program.cs
 1 public class Startup
 2     {
 3         public Startup(IConfiguration configuration, IWebHostEnvironment env)
 4         {
 5             Env = env;
 6             Configuration = configuration;
 7         }
 8 
 9         public IConfiguration Configuration { get; }
10 
11         public IWebHostEnvironment Env { get; }
12 
13         // This method gets called by the runtime. Use this method to add services to the container.
14         public void ConfigureServices(IServiceCollection services)
15         {
16             services.AddSingleton(new Appsettings(Env.ContentRootPath));
17 
18             services.AddDbContext<UserContext>(options => options.UseCosmos(Appsettings.app("CosmosDB", "Endpoint"), Appsettings.app("CosmosDB", "Key"), Appsettings.app("CosmosDB", "DataBase")));
19 
20             services.AddControllersWithViews();
21         }
22 
23         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
24         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
25         {
26             if (env.IsDevelopment())
27             {
28                 app.UseDeveloperExceptionPage();
29             }
30             else
31             {
32                 app.UseExceptionHandler("/Home/Error");
33             }
34             app.UseStaticFiles();
35 
36             app.UseRouting();
37 
38             app.UseAuthorization();
39 
40             app.UseEndpoints(endpoints =>
41             {
42                 endpoints.MapControllerRoute(
43                     name: "default",
44                     pattern: "{controller=Home}/{action=Index}/{id?}");
45             });
46         }
47     }
Startup.cs

 3,運行項目,查看測試結果

咱們能夠看到UserModel 表已初始化數據完成

 咱們轉到Azure Portal 上查看 "CNBATEBLOGWEB" 數據庫下多了叫 「UserContext」 的 Container 這裏的能夠理解成存放表的容器

同時,咱們能夠看到 」UserContext「 下的 Item 多了兩條 Usermodel 數據,咱們分別進行查看,能夠看到這兩條數據就是剛剛生成的種子數據

ok,今天的分享就到此,撒花是🎉🎉🎉🎉🎉

-------------------我是分割線-------------------

原本我想嘗試直接能夠經過VS 的 Cloud Explorer 進行查看 cosmosDB 中的數據,可是無奈每當點擊 Container 下的更多的時候,VS 就進行報錯

 有知道怎麼解決這個問題的朋友,還望告知一下。

三,結尾

今天咱們先操做這麼多,簡單的使用 EF 對 Azure Cosmos DB 進程操做,生產種子數據,以及如何查看生成好的種子數據,下一篇繼續講解使用 EF 來操做操做Azure CosmosDB,而且對其中的數據庫中的數據如何作增長,刪除,修改,查詢等操做。

github:https://github.com/yunqian44/Azure.CosmosDB.git

做者:Allen 

版權:轉載請在文章明顯位置註明做者及出處。如發現錯誤,歡迎批評指正。

相關文章
相關標籤/搜索