1. 程式人生 > >面向物件儲存框架:Obase快速入門

面向物件儲存框架:Obase快速入門

在專案中完成物件建模後,可以使用Obase來進行物件的管理(例如物件持久化),本篇教程將建立一個.NET Core控制檯應用,來展示Obase的配置和物件的增刪改查操作。本篇教程旨在指引簡單入門。 本篇教程將以此物件模型展開 ```plantuml class Blog{ +BlogId:int[文章Id] +Url:string[文章地址] +Post:sList[文章評論] } class Post{ +PostId:int[評論Id] +Title:string[評論標題] +Content:string[評論內容] +Blog:Blog[關聯文章] } Blog "1"-right-"*" Post hide empty member ``` #### 從NuGet安裝Obase - 在VS的NuGet包管理器中新增程式包源:http://nuget.suiyiyun.cn:8081/nuget - 在NuGet包管理器中選擇Obase進行安裝 #### 專案搭建 - 開啟 Visual Studio - 單擊“建立新專案” - 選擇帶有 C# 標記的“控制檯應用 (.NET Core)” ,然後單擊“下一步” - 輸入“ObaseTutorial” 作為名稱,然後單擊“建立” - 新增對freep.Obase.dll的引用 #### 定義領域實體類 ```csharp /// /// 文章 ///
public class Blog { private int blogId; private string url; private List posts; /// /// 文章Id /// public int BlogId { get => blogId; set => blogId = value; } /// /// 文章地址 /// public string Url { get => url; set => url = value; } /// /// 文章評論(注意:關聯引用屬性需要定義為virtual) ///
public virtual List Posts { get => posts; set => posts = value; } } /// /// 文章評論 /// public class Post { private int postId; private string title; private string content; private int blogId; private Blog blog; /// /// 評論Id ///
public int PostId { get => postId; set => postId = value; } /// /// 評論標題 /// public string Title { get => title; set => title = value; } /// /// 評論內容 /// public string Content { get => content; set => content = value; } /// /// 文章Id /// public int BlogId { get => blogId; set => blogId = value; } /// /// 關聯文章(注意:關聯引用屬性需要定義為virtual) /// public virtual Blog Blog { get => blog; set => blog = value; } } ``` #### 自定義物件上下文 Obase直接與應用程式進行互動的便是ObectContext(物件上下文),專案中可以根據具體情況定義一個或者多個繼承於ObjectContext的自定義物件上下文。 ```csharp using freep.Obase; using freep.Obase.ExecuteSql; using freep.Obase.Odm.Builder; /// /// 自定義物件上下文 /// public class MyContext : ObjectContext { /// /// 建構函式 /// public MyContext() : base("user=root;password=;server=localhost;database=ObaseTutorial;SslMode = none;port=3306;", true) { } } ``` 注意:自定義物件上下文通過繼承父類的建構函式設定資料來源連線字串(此處為了演示方便,直接將連線字串作為引數進行傳遞,實際專案中可以定義到配置檔案中)。
#### 配置物件模型 在物件資料模型生成之前,可以對資料來源的型別進行設定,以及物件資料模型的配置,配置的型別包括實體型別,關聯型別,關聯引用,關聯端,屬性等的配置,本篇只展示最基本的實體型別,關聯型別,關聯引用的配置。 ```csharp /// /// 自定義物件上下文 /// public class MyContext : ObjectContext { /// /// 在即將生成物件資料模型並註冊到物件上下文之前呼叫此方法 /// /// 建模器 protected override void OnModelCreating(ModelBuilder modelBuilder) { //設定模型對映目標源的型別(預設不設定未SQLServer) modelBuilder.HasTargetSourceType(eDataSource.MySql); //配置物件資料模型 this.ModelConfiguratoin(modelBuilder); base.OnModelCreating(modelBuilder); } /// /// 配置物件資料模型 /// /// 建模器 protected virtual void ModelConfiguratoin(ModelBuilder modelBuilder) { //配置實體型 var blogCfg = modelBuilder.Entity(); //設定實體型的對映資料表 blogCfg.ToTable("Blog"); //設定實體型的標識屬性 blogCfg.HasKeyAttribute(p => p.BlogId); //設定實體型的標識屬性為自增 blogCfg.HasKeyIsSelfIncreased(true); //配置實體型 var postCfg = modelBuilder.Entity(); //設定實體型的對映資料表 postCfg.ToTable("Post"); //設定實體型的標識屬性 postCfg.HasKeyAttribute(p => p.PostId); //設定實體型的標識屬性為自增 postCfg.HasKeyIsSelfIncreased(true); //配置物件間隱式關聯型別 var blogAssPostCfg = modelBuilder.Association(); //設定關聯型別的對映資料表 blogAssPostCfg.ToTable("Post"); //設定關聯對映端1(參照方)的鍵屬性以及在關聯表中對映的欄位 blogAssPostCfg.AssociationEnd("End1").HasMapping("BlogId", "BlogId"); //設定關聯對映端2(被參照方)的鍵屬性以及在關聯表中對映的欄位 //注意:HasDefaultAsNew方法設定一個值,該值指示是否把關聯端物件預設視為新物件。當該屬性為true時,如果關聯端物件未被顯式附加到上下文,該物件將被視為新物件實施持久化。 blogAssPostCfg.AssociationEnd("End2").HasMapping("PostId", "PostId").HasDefaultAsNew(true); //配置實體型別的關聯引用屬性 //引數一:關聯引用屬性的名稱 引數二:關聯引用是否具有多重性 //注:此處在配置Blog實體與Post實體關聯引用屬性Posts var blogRefPosts = blogCfg.AssociationReference("Posts", true); //設定關聯引用的本端 blogRefPosts.HasLeftEnd("End1"); //設定關聯引用的對端 blogRefPosts.HasRightEnd("End2"); //設定關聯引用屬性延遲載入 blogRefPosts.HasEnableLazyLoading(true); //配置實體型別的關聯引用屬性 //引數一:關聯引用屬性的名稱 引數二:關聯引用是否具有多重性 //注:此處在配置Post實體與Blog實體關聯引用屬性Blog var postRefBlog = postCfg.AssociationReference("Blog", false); //設定關聯引用的本端(注意此處Post是作為本端的) postRefBlog.HasLeftEnd("End2"); //設定關聯引用的對端 postRefBlog.HasRightEnd("End1"); } } ``` #### 定義物件集 最終對物件的操作和訪問是通過物件上下文提供的物件集,此處我們定義文章和文章評論物件集: ```csharp /// /// 自定義物件上下文 /// public class MyContext : ObjectContext { /// /// 文章物件集 /// public ObjectSet Blogs { get; set; } /// /// 文章評論物件集 /// public ObjectSet Posts { get; set; } } ``` #### 物件的建立、讀取、更新和刪除 ##### 例項化物件上下文 ```csharp var myContext = new MyContext(); ``` ##### 建立 ```csharp //例項化物件 Blog blog = new Blog() { Url = "https://www.yuque.com/geekfish/obase/getting-started", Posts = new List() { new Post (){ Title= "請問Obase怎麼安裝?", Content = "暫時只提供dll檔案"} } }; //將物件附加到物件上下文 myContext.Blogs.Attach(blog); //將物件儲存到資料來源 myContext.SaveChanges(); ``` ##### 讀取 ```csharp using System.Linq; //從持久化源查詢資料 Blog firstBlog = myContext.Blogs.OrderBy(p => p.Url).First(); //訪問關聯引用屬性 List posts = firstBlog.Posts; ``` ##### 更新 ```csharp //修改屬性 firstBlog.Url = "http://www.test.com/aa.html"; //將物件儲存到資料來源 myContext.SaveChanges(); ``` ##### 刪除 ```csharp //刪除指定物件 myContext.Blogs.Remove(firstBlog); //根據條件刪除指定物件 myContext.Blogs.Delete(p => p.BlogId == 1); //將物件儲存到資料來源(只有在儲存後,資料才真實刪除) myContext.SaveChanges(); ```