面向對象存儲框架: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();

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

您可能也會喜歡…