zoukankan      html  css  js  c++  java
  • 面向对象存储框架: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

    项目搭建

    • 打开 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();
    
  • 相关阅读:
    JavaScript对原始数据类型的拆装箱操作
    Javascript继承(原始写法,非es6 class)
    动态作用域与词法作用域
    自行车的保养
    探索JS引擎工作原理 (转)
    C语言提高 (7) 第七天 回调函数 预处理函数DEBUG 动态链接库
    C语言提高 (6) 第六天 文件(续) 链表的操作
    C语言提高 (5) 第五天 结构体,结构体对齐 文件
    C语言提高 (4) 第四天 数组与数组作为参数时的数组指针
    C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间
  • 原文地址:https://www.cnblogs.com/yuziyan/p/13140692.html
Copyright © 2011-2022 走看看