面向物件儲存框架:Obase快速入門
阿新 • • 發佈:2020-06-16
在專案中完成物件建模後,可以使用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();
```
#### 配置物件模型 在物件資料模型生成之前,可以對資料來源的型別進行設定,以及物件資料模型的配置,配置的型別包括實體型別,關聯型別,關聯引用,關聯端,屬性等的配置,本篇只展示最基本的實體型別,關聯型別,關聯引用的配置。 ```csharp ///