Azure Cosmos DB (二) SQL API 操作
一,引言
還記得國慶期間,我們學習了一下關於Azure Cosmos DB 的一些基礎知識以及Azure Cosmos DB 的幾種支援資料庫類型。今天就開始分享一些實戰操作,如何通過Azure Portal 創建 Cosmos DB,以及在實際項目中如何通過程式碼操作資料庫。
今天要演示的是 Core(SQL) 核心,SQL API 是具有豐富的SQL查詢功能的無架構 JSON 資料庫引擎,它是以 json 形式的文檔資料庫。同時微軟提供了對應的 EF 的操作包 —– Microsoft.EntityFrameworkCore.Cosmos,使得我們很輕鬆的使用原有EF操作資料庫的模式進行操作 Cosmos DB。
注意這裡使用的 Microsoft.EntityFrameworkCore.Cosmos 僅適用於 Azure Cosmos DB 的 SQL API
——————–我是分割線——————–
1,Azure Cosmos DB (一) 入門介紹
2,Azure Cosmos DB (二) SQL API 操作
二,正文
1, 創建Azure Cosmos DB
在Azure portal 中點擊 「+ 創建資源」,在搜索框中輸入 「Azure Cosmos DB」 進行搜索
點擊 「Create」 ,進行開始創建
Resource Group:”Web_Test_DB_RG”
Account Name:”cnbateblogwebcosmosdb”
API 選擇:Core(SQL)
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("//*: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://github.com/yunqian44/Azure.CosmosDB.git
作者:Allen
版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。