還記得國慶期間,咱們學習了一下關於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
在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.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 }
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 }
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 }
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 }
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 }
咱們能夠看到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
版權:轉載請在文章明顯位置註明做者及出處。如發現錯誤,歡迎批評指正。