在项目中完成对象建模后,可以使用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();

面向对象存储框架: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. 【MySQL】深入理解MySQL锁和事务隔离级别

    先看个小案例: 话不多说,上案例,先创建一个表 mysql> CREATE TABLE IF NOT EXISTS `account`( `id` INT UNSIGNED AUTO_INCRE ...

  2. Msql 给结果拼接字符串

    SELECT CONCAT("内容:",info)AS info FROM 表名;

  3. NO.3 MSP432P4_SDK浏览

    网上关于MSP432的参考资料很少,我们要学习的最权威的资源只有TI提供的SDK.这是好处也是坏处,好处是我们学习的是TI一手资源,不再是拾人牙慧:坏处是英语能力要求较高. 闲话少说,我们先来看SDK ...

  4. KEA128+SHT30+CRC校验

    最近更新产品功能的时候使用到Sensirion的SHT30(温湿度传感器),虽说官网上有例程(STM32F100RB),但用的是软件模拟I2C时序控制SHT30进行温湿度读取,我用的是S9KEA128 ...

  5. SSM 的 基本原理与面试相关

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.MyBatis 1.Mybatis出现最多的问题是什么? 问题: 在XML配置文件中语句的书写与对象 ...

  6. Java实现 LeetCode 621 任务调度器(暴力大法)

    621. 任务调度器 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时 ...

  7. Java实现 蓝桥杯VIP 算法训练 阶乘末尾

    问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示答案.长度不足用前置零补全. 样例输入 6 5 样例输出 00720 数据规模和约 ...

  8. Java实现蓝桥杯VIP算法训练 预测身高

    试题 算法训练 预测身高 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述: 生理卫生老师在课堂上娓娓道来: 你能看见你未来的样子吗?显然不能.但你能预测自己成年后的身高,有公式: 男 ...

  9. Java实现算法竞赛入门经典例题-蚂蚁

    问题描述 一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒. 当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计). 给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂 ...

  10. java实现第五届蓝桥杯绳圈

    绳圈 题目描述 今有 100 根绳子,当然会有 200 个绳头. 如果任意取绳头两两配对,把所有绳头都打结连接起来.最后会形成若干个绳圈(不考虑是否套在一起). 我们的问题是:请计算最后将形成多少个绳 ...