面向對象存儲框架:Obase快速入門
在項目中完成對象建模后,可以使用Obase來進行對象的管理(例如對象持久化),本篇教程將創建一個.NET Core控制台應用,來展示Obase的配置和對象的增刪改查操作。本篇教程旨在指引簡單入門。
本篇教程將以此對象模型展開
class Blog{
+BlogId:int[文章Id]
+Url:string[文章地址]
+Post:sList<Post>[文章評論]
}
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的引用
定義領域實體類
/// <summary>
/// 文章
/// </summary>
public class Blog
{
private int blogId;
private string url;
private List<Post> posts;
/// <summary>
/// 文章Id
/// </summary>
public int BlogId { get => blogId; set => blogId = value; }
/// <summary>
/// 文章地址
/// </summary>
public string Url { get => url; set => url = value; }
/// <summary>
/// 文章評論(注意:關聯引用屬性需要定義為virtual)
/// </summary>
public virtual List<Post> Posts { get => posts; set => posts = value; }
}
/// <summary>
/// 文章評論
/// </summary>
public class Post
{
private int postId;
private string title;
private string content;
private int blogId;
private Blog blog;
/// <summary>
/// 評論Id
/// </summary>
public int PostId { get => postId; set => postId = value; }
/// <summary>
/// 評論標題
/// </summary>
public string Title { get => title; set => title = value; }
/// <summary>
/// 評論內容
/// </summary>
public string Content { get => content; set => content = value; }
/// <summary>
/// 文章Id
/// </summary>
public int BlogId { get => blogId; set => blogId = value; }
/// <summary>
/// 關聯文章(注意:關聯引用屬性需要定義為virtual)
/// </summary>
public virtual Blog Blog { get => blog; set => blog = value; }
}
自定義對象上下文
Obase直接與應用程序進行交互的便是ObectContext(對象上下文),項目中可以根據具體情況定義一個或者多個繼承於ObjectContext的自定義對象上下文。
using freep.Obase;
using freep.Obase.ExecuteSql;
using freep.Obase.Odm.Builder;
/// <summary>
/// 自定義對象上下文
/// </summary>
public class MyContext : ObjectContext
{
/// <summary>
/// 構造函數
/// </summary>
public MyContext() : base("user=root;password=;server=localhost;database=ObaseTutorial;SslMode = none;port=3306;", true)
{
}
}
注意:自定義對象上下文通過繼承父類的構造函數設置數據源連接字符串(此處為了演示方便,直接將連接字符串作為參數進行傳遞,實際項目中可以定義到配置文件中)。
配置對象模型
在對象數據模型生成之前,可以對數據源的類型進行設置,以及對象數據模型的配置,配置的類型包括實體類型,關聯類型,關聯引用,關聯端,屬性等的配置,本篇只展示最基本的實體類型,關聯類型,關聯引用的配置。
/// <summary>
/// 自定義對象上下文
/// </summary>
public class MyContext : ObjectContext
{
/// <summary>
/// 在即將生成對象數據模型並註冊到對象上下文之前調用此方法
/// </summary>
/// <param name="modelBuilder">建模器</param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//設置模型映射目標源的類型(默認不設置未SQLServer)
modelBuilder.HasTargetSourceType(eDataSource.MySql);
//配置對象數據模型
this.ModelConfiguratoin(modelBuilder);
base.OnModelCreating(modelBuilder);
}
/// <summary>
/// 配置對象數據模型
/// </summary>
/// <param name="modelBuilder">建模器</param>
protected virtual void ModelConfiguratoin(ModelBuilder modelBuilder)
{
//配置實體型
var blogCfg = modelBuilder.Entity<Blog>();
//設置實體型的映射數據表
blogCfg.ToTable("Blog");
//設置實體型的標識屬性
blogCfg.HasKeyAttribute(p => p.BlogId);
//設置實體型的標識屬性為自增
blogCfg.HasKeyIsSelfIncreased(true);
//配置實體型
var postCfg = modelBuilder.Entity<Post>();
//設置實體型的映射數據表
postCfg.ToTable("Post");
//設置實體型的標識屬性
postCfg.HasKeyAttribute(p => p.PostId);
//設置實體型的標識屬性為自增
postCfg.HasKeyIsSelfIncreased(true);
//配置對象間隱式關聯類型
var blogAssPostCfg = modelBuilder.Association<Blog, Post>();
//設置關聯類型的映射數據表
blogAssPostCfg.ToTable("Post");
//設置關聯映射端1(參照方)的鍵屬性以及在關聯表中映射的字段
blogAssPostCfg.AssociationEnd<Blog>("End1").HasMapping("BlogId", "BlogId");
//設置關聯映射端2(被參照方)的鍵屬性以及在關聯表中映射的字段
//注意:HasDefaultAsNew方法設置一個值,該值指示是否把關聯端對象默認視為新對象。當該屬性為true時,如果關聯端對象未被顯式附加到上下文,該對象將被視為新對象實施持久化。
blogAssPostCfg.AssociationEnd<Post>("End2").HasMapping("PostId", "PostId").HasDefaultAsNew(true);
//配置實體類型的關聯引用屬性
//參數一:關聯引用屬性的名稱 參數二:關聯引用是否具有多重性
//注:此處在配置Blog實體與Post實體關聯引用屬性Posts
var blogRefPosts = blogCfg.AssociationReference<Blog, Post>("Posts", true);
//設置關聯引用的本端
blogRefPosts.HasLeftEnd("End1");
//設置關聯引用的對端
blogRefPosts.HasRightEnd("End2");
//設置關聯引用屬性延遲加載
blogRefPosts.HasEnableLazyLoading(true);
//配置實體類型的關聯引用屬性
//參數一:關聯引用屬性的名稱 參數二:關聯引用是否具有多重性
//注:此處在配置Post實體與Blog實體關聯引用屬性Blog
var postRefBlog = postCfg.AssociationReference<Blog, Post>("Blog", false);
//設置關聯引用的本端(注意此處Post是作為本端的)
postRefBlog.HasLeftEnd("End2");
//設置關聯引用的對端
postRefBlog.HasRightEnd("End1");
}
}
定義對象集
最終對對象的操作和訪問是通過對象上下文提供的對象集,此處我們定義文章和文章評論對象集:
/// <summary>
/// 自定義對象上下文
/// </summary>
public class MyContext : ObjectContext
{
/// <summary>
/// 文章對象集
/// </summary>
public ObjectSet<Blog> Blogs { get; set; }
/// <summary>
/// 文章評論對象集
/// </summary>
public ObjectSet<Post> Posts { get; set; }
}
對象的創建、讀取、更新和刪除
實例化對象上下文
var myContext = new MyContext();
創建
//實例化對象
Blog blog = new Blog()
{
Url = "https://www.yuque.com/geekfish/obase/getting-started",
Posts = new List<Post>() {
new Post (){ Title= "請問Obase怎麼安裝?", Content = "暫時只提供dll文件"}
}
};
//將對象附加到對象上下文
myContext.Blogs.Attach(blog);
//將對象保存到數據源
myContext.SaveChanges();
讀取
using System.Linq;
//從持久化源查詢數據
Blog firstBlog = myContext.Blogs.OrderBy(p => p.Url).First();
//訪問關聯引用屬性
List<Post> posts = firstBlog.Posts;
更新
//修改屬性
firstBlog.Url = "http://www.test.com/aa.html";
//將對象保存到數據源
myContext.SaveChanges();
刪除
//刪除指定對象
myContext.Blogs.Remove(firstBlog);
//根據條件刪除指定對象
myContext.Blogs.Delete(p => p.BlogId == 1);
//將對象保存到數據源(只有在保存后,數據才真實刪除)
myContext.SaveChanges();
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!
※教你寫出一流的銷售文案?
※超省錢租車方案
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※產品缺大量曝光嗎?你需要的是一流包裝設計!