在项目中完成对象建模后,可以使用Obase来进行对象的管理(例如对象持久化),本篇教程将创建一个.NET Core控制台应用,来展示Obase的配置和对象的增删改查操作。本篇教程旨在指引简单入门。

本篇教程将以此对象模型展开

  1. class Blog{
  2. +BlogId:int[文章Id]
  3. +Url:string[文章地址]
  4. +Post:sList<Post>[文章评论]
  5. }
  6. class Post{
  7. +PostId:int[评论Id]
  8. +Title:string[评论标题]
  9. +Content:string[评论内容]
  10. +Blog:Blog[关联文章]
  11. }
  12. Blog "1"-right-"*" Post
  13. hide empty member

从NuGet安装Obase

项目搭建

  • 打开 Visual Studio
  • 单击“创建新项目”
  • 选择带有 C# 标记的“控制台应用 (.NET Core)” ,然后单击“下一步”
  • 输入“ObaseTutorial” 作为名称,然后单击“创建”
  • 添加对freep.Obase.dll的引用

定义领域实体类

  1. /// <summary>
  2. /// 文章
  3. /// </summary>
  4. public class Blog
  5. {
  6. private int blogId;
  7. private string url;
  8. private List<Post> posts;
  9. /// <summary>
  10. /// 文章Id
  11. /// </summary>
  12. public int BlogId { get => blogId; set => blogId = value; }
  13. /// <summary>
  14. /// 文章地址
  15. /// </summary>
  16. public string Url { get => url; set => url = value; }
  17. /// <summary>
  18. /// 文章评论(注意:关联引用属性需要定义为virtual)
  19. /// </summary>
  20. public virtual List<Post> Posts { get => posts; set => posts = value; }
  21. }
  22. /// <summary>
  23. /// 文章评论
  24. /// </summary>
  25. public class Post
  26. {
  27. private int postId;
  28. private string title;
  29. private string content;
  30. private int blogId;
  31. private Blog blog;
  32. /// <summary>
  33. /// 评论Id
  34. /// </summary>
  35. public int PostId { get => postId; set => postId = value; }
  36. /// <summary>
  37. /// 评论标题
  38. /// </summary>
  39. public string Title { get => title; set => title = value; }
  40. /// <summary>
  41. /// 评论内容
  42. /// </summary>
  43. public string Content { get => content; set => content = value; }
  44. /// <summary>
  45. /// 文章Id
  46. /// </summary>
  47. public int BlogId { get => blogId; set => blogId = value; }
  48. /// <summary>
  49. /// 关联文章(注意:关联引用属性需要定义为virtual)
  50. /// </summary>
  51. public virtual Blog Blog { get => blog; set => blog = value; }
  52. }

自定义对象上下文

Obase直接与应用程序进行交互的便是ObectContext(对象上下文),项目中可以根据具体情况定义一个或者多个继承于ObjectContext的自定义对象上下文。

  1. using freep.Obase;
  2. using freep.Obase.ExecuteSql;
  3. using freep.Obase.Odm.Builder;
  4. /// <summary>
  5. /// 自定义对象上下文
  6. /// </summary>
  7. public class MyContext : ObjectContext
  8. {
  9. /// <summary>
  10. /// 构造函数
  11. /// </summary>
  12. public MyContext() : base("user=root;password=;server=localhost;database=ObaseTutorial;SslMode = none;port=3306;", true)
  13. {
  14. }
  15. }

注意:自定义对象上下文通过继承父类的构造函数设置数据源连接字符串(此处为了演示方便,直接将连接字符串作为参数进行传递,实际项目中可以定义到配置文件中)。

配置对象模型

在对象数据模型生成之前,可以对数据源的类型进行设置,以及对象数据模型的配置,配置的类型包括实体类型,关联类型,关联引用,关联端,属性等的配置,本篇只展示最基本的实体类型,关联类型,关联引用的配置。

  1. /// <summary>
  2. /// 自定义对象上下文
  3. /// </summary>
  4. public class MyContext : ObjectContext
  5. {
  6. /// <summary>
  7. /// 在即将生成对象数据模型并注册到对象上下文之前调用此方法
  8. /// </summary>
  9. /// <param name="modelBuilder">建模器</param>
  10. protected override void OnModelCreating(ModelBuilder modelBuilder)
  11. {
  12. //设置模型映射目标源的类型(默认不设置未SQLServer)
  13. modelBuilder.HasTargetSourceType(eDataSource.MySql);
  14. //配置对象数据模型
  15. this.ModelConfiguratoin(modelBuilder);
  16. base.OnModelCreating(modelBuilder);
  17. }
  18. /// <summary>
  19. /// 配置对象数据模型
  20. /// </summary>
  21. /// <param name="modelBuilder">建模器</param>
  22. protected virtual void ModelConfiguratoin(ModelBuilder modelBuilder)
  23. {
  24. //配置实体型
  25. var blogCfg = modelBuilder.Entity<Blog>();
  26. //设置实体型的映射数据表
  27. blogCfg.ToTable("Blog");
  28. //设置实体型的标识属性
  29. blogCfg.HasKeyAttribute(p => p.BlogId);
  30. //设置实体型的标识属性为自增
  31. blogCfg.HasKeyIsSelfIncreased(true);
  32. //配置实体型
  33. var postCfg = modelBuilder.Entity<Post>();
  34. //设置实体型的映射数据表
  35. postCfg.ToTable("Post");
  36. //设置实体型的标识属性
  37. postCfg.HasKeyAttribute(p => p.PostId);
  38. //设置实体型的标识属性为自增
  39. postCfg.HasKeyIsSelfIncreased(true);
  40. //配置对象间隐式关联类型
  41. var blogAssPostCfg = modelBuilder.Association<Blog, Post>();
  42. //设置关联类型的映射数据表
  43. blogAssPostCfg.ToTable("Post");
  44. //设置关联映射端1(参照方)的键属性以及在关联表中映射的字段
  45. blogAssPostCfg.AssociationEnd<Blog>("End1").HasMapping("BlogId", "BlogId");
  46. //设置关联映射端2(被参照方)的键属性以及在关联表中映射的字段
  47. //注意:HasDefaultAsNew方法设置一个值,该值指示是否把关联端对象默认视为新对象。当该属性为true时,如果关联端对象未被显式附加到上下文,该对象将被视为新对象实施持久化。
  48. blogAssPostCfg.AssociationEnd<Post>("End2").HasMapping("PostId", "PostId").HasDefaultAsNew(true);
  49. //配置实体类型的关联引用属性
  50. //参数一:关联引用属性的名称 参数二:关联引用是否具有多重性
  51. //注:此处在配置Blog实体与Post实体关联引用属性Posts
  52. var blogRefPosts = blogCfg.AssociationReference<Blog, Post>("Posts", true);
  53. //设置关联引用的本端
  54. blogRefPosts.HasLeftEnd("End1");
  55. //设置关联引用的对端
  56. blogRefPosts.HasRightEnd("End2");
  57. //设置关联引用属性延迟加载
  58. blogRefPosts.HasEnableLazyLoading(true);
  59. //配置实体类型的关联引用属性
  60. //参数一:关联引用属性的名称 参数二:关联引用是否具有多重性
  61. //注:此处在配置Post实体与Blog实体关联引用属性Blog
  62. var postRefBlog = postCfg.AssociationReference<Blog, Post>("Blog", false);
  63. //设置关联引用的本端(注意此处Post是作为本端的)
  64. postRefBlog.HasLeftEnd("End2");
  65. //设置关联引用的对端
  66. postRefBlog.HasRightEnd("End1");
  67. }
  68. }

定义对象集

最终对对象的操作和访问是通过对象上下文提供的对象集,此处我们定义文章和文章评论对象集:

  1. /// <summary>
  2. /// 自定义对象上下文
  3. /// </summary>
  4. public class MyContext : ObjectContext
  5. {
  6. /// <summary>
  7. /// 文章对象集
  8. /// </summary>
  9. public ObjectSet<Blog> Blogs { get; set; }
  10. /// <summary>
  11. /// 文章评论对象集
  12. /// </summary>
  13. public ObjectSet<Post> Posts { get; set; }
  14. }

对象的创建、读取、更新和删除

实例化对象上下文
  1. var myContext = new MyContext();
创建
  1. //实例化对象
  2. Blog blog = new Blog()
  3. {
  4. Url = "https://www.yuque.com/geekfish/obase/getting-started",
  5. Posts = new List<Post>() {
  6. new Post (){ Title= "请问Obase怎么安装?", Content = "暂时只提供dll文件"}
  7. }
  8. };
  9. //将对象附加到对象上下文
  10. myContext.Blogs.Attach(blog);
  11. //将对象保存到数据源
  12. myContext.SaveChanges();
读取
  1. using System.Linq;
  2. //从持久化源查询数据
  3. Blog firstBlog = myContext.Blogs.OrderBy(p => p.Url).First();
  4. //访问关联引用属性
  5. List<Post> posts = firstBlog.Posts;
更新
  1. //修改属性
  2. firstBlog.Url = "http://www.test.com/aa.html";
  3. //将对象保存到数据源
  4. myContext.SaveChanges();
删除
  1. //删除指定对象
  2. myContext.Blogs.Remove(firstBlog);
  3. //根据条件删除指定对象
  4. myContext.Blogs.Delete(p => p.BlogId == 1);
  5. //将对象保存到数据源(只有在保存后,数据才真实删除)
  6. myContext.SaveChanges();

面向对象存储框架:Obase快速入门的更多相关文章

  1. Nodejs ORM框架Sequelize快速入门

    Nodejs ORM框架Sequelize快速入门 什么是ORM? 简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全.可维护的SQL代码.直观上,是一种Model ...

  2. ssm框架整合快速入门

    写在前面: 公司一直都是使用ssh框架(Struts2,Spring,Hibernate)来开发,但是现在外面的公司大多数都是使用的ssm框架,所以也有必要多学习一下外面的新技术.这里就快速搭建一个小 ...

  3. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

  4. [jbdj]SpringMVC框架(1)快速入门

    1)springmvc快速入门(传统版) 步一:创建springmvc_demo一个web应用 步二:导入springioc,springweb , springmvc相关的jar包 步三:在/WEB ...

  5. Hibernate入门第一讲——Hibernate框架的快速入门

    Hibernate框架的概述 什么是框架? 框架指的是软件的半成品,已经完成了部分功能. JavaEE开发的三层架构 了解框架的基本概念之后,我们就来看看Hibernate框架处于JavaEE开发的经 ...

  6. Python 什么是flask框架?快速入门

    一:Python flask框架 前言 1.Python 面向对象的高级编程语言,以其语法简单.免费开源.免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析. ...

  7. 分布式应用框架Akka快速入门

    转自:http://blog.csdn.net/jmppok/article/details/17264495 本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明.引用资料 ...

  8. Shiro安全框架【快速入门】就这一篇!

    Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro™ is a powerful and easy-to-use Java security framework that perfo ...

  9. MyBatis 框架之快速入门程序

    一.使用 IDEA 快速创建 Maven 项目 关于如何快速创建 Maven 项目,这个可以参考下面这篇文章: Maven 项目管理工具基础入门系列(一) 二.快速配置 MyBatis 依赖 jar ...

随机推荐

  1. Lowest Common Multiple Plus(hdu2028)

    思考: 乘法爆咋数据.把int换成unsigned就过了,同时%d换成%u.求最大公约数和最小公倍数. #include<stdio.h> int gcd(unsigned x, unsi ...

  2. JUC整理笔记二之聊聊volatile

    要想学好JUC,还得先了解 volatile 这个关键字.了解 volatile ,我们从一个例子开始吧. 本文不会很详细去说java内存模型,只是很简单地学习一下volatile 一个例子 pack ...

  3. MySQL复制表结构以及复制表等等

    mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 1 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2; 或 1 CREATE TABL ...

  4. 永久关闭windows更新步骤

    在搜索“web和windows”框中输入“服务” 在搜索结果中点击第一个,那个图标像齿轮的那个!如下图. 在打开的“服务”窗口中,我们找到windows update   找到”windows upd ...

  5. 安装superset遇到的坑

    实验环境:ubuntu16.04 python环境: 3.6.7 安装参考:https://superset.incubator.apache.org/installation.html 特别提醒: ...

  6. 关于String是值传递还是引用传递

    public class Itv { static String ss = "kkkkkk"; static String ss1 = new String("kkkkk ...

  7. css 图片宽度、居中、倒影

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Java Spring Cloud 实战之路 - 1 创建项目

    0. 前言 该项目使用Maven进行管理和构建,所以需要预先配置好Maven.嗯,在这个系列里就不做过多的介绍了. 1. 创建项目 先创建一个pom.xml 文件,添加以下内容: <?xml v ...

  9. 深入理解JS:var、let、const的异同

    目录 序言 var 与 let 的区别 作用域 重复声明 绑定全局对象 变量提升与暂存死区 let 与 const 异同 参考 1.序言 var.let 和 const 都是 JavaScript 中 ...

  10. 【HBase】与关系型数据库区别、行式/列式存储

    [HBase]与关系型数据库区别 1.本质区别 mysql:关系型数据库,行式存储,ACID,SQL,只能存储结构化数据 事务的原子性(Atomicity):是指一个事务要么全部执行,要么不执行,也就 ...