我为什么维护MyStaging

目前该项目只有我一个人在维护,权当学习交流。为什么要继续维护呢,说一千道一万,还是因为喜欢,由于他的简单易用,从而促使我决定对 MyStaging 进行升级,目前 3.0+的版本和2.1.13 是不兼容的两套体系,3.0+ 体系架构更灵活清晰,可操作性和易用性更强。

欢迎使用 MyStaging

项目地址

https://github.com/lianggx/mystaging

MyStaging 是一款基于 .NETCore 平台的 ORM 中间件,提供简单易用的接入工具,全链路写法,支持 DbFirst/CodeFirst,而且两种模式(DbFirst/CodeFirst)可以无缝切换。比如一开始你是先创建数据库,然后生成了实体,在接下来的开发过程中,改动实体对象后,可以使用CodeFirst进行无缝迁移,自由使用DbFirst/CodeFirst进行迁移工作 。

支持多种数据库类型,和 EF 不同的是,对单个项目的多路上下文支持中引进了主从数据库概念,查询默认从库,也可以指定主库,删除/修改/新增操作默认走主库,地层还提供了对单个查询数据的分布式缓存操作,可以自由灵活配置,目前 MyStaging 还在持续完善中,欢迎加入 Star/Contributors/Fork。

相关组件

MyStaging一共分为三个部分,分别是:

  • 1、基础框架 - MyStaging
  • 2、提供程序 - MyStaging.Mysql/MyStaging.PostgreSQL
  • 3、迁移工具 - MyStaging.Gen

在包管理控制台安装 MyStaging.Gen 到 dotnet tool 命令

MyStaging.Gen 是一个独立的数据库迁移组件,其本质上是一个控制台程序,你可以单独下载这个包到本地,也可以将他安装到 dotnet tool ,安装到 dotnet tool 后,你就可以在 visual studio 中使用命令进行数据库的迁移工作。

安装迁移工具到 dotnet tool

dotnet tool install -g MyStaging.Gen

要使用 MyStaging.Gen 请根据下面的参数说明,执行创建实体对象映射.

--help 查看帮助
-m [mode,db[DbFirst]/code[CodeFirst],默认为 DbFirst
-t [dbtype[Mysql/PostgreSQL],数据库提供程序] required
-d [database,数据库连接字符串] required
-p [project,项目名称] required
-o [output,实体对象输出路径],默认为 {project}/Models
==============示例==============
CodeFirst:
mystaging.gen -m code -t PostgreSQL -p Pgsql -d "Host=127.0.0.1;Port=5432;Username=postgres;Password=postgres;Database=mystaging;" DbFirst:
mystaging.gen -m db -t PostgreSQL -p Pgsql -d "Host=127.0.0.1;Port=5432;Username=postgres;Password=postgres;Database=mystaging;"
================================

** 注意,上面的两种迁移模式可以实时切换使用,不影响一开始选择的模式,且无副作用。

如何选择数据库提供程序

MyStaging 提供了多种数据库的支持,目前提供了 PostgreSQL/Mysql 的支持,后续将陆续开发更多提供程序,比如基于 PostgreSQL 进行开发的程序,那么可以选择引用包 MyStaing.PostgreSQL。

数据库 提供程序
PostgreSQL MyStaing.PostgreSQL
Mysql MyStaging.Mysql

迁移过程

当你进行数据库关系迁移后,MyStaging会在指定的路径上生成实体对象文件目录:Model,该目录包含了数据库上下文对象 xxxDbContext 和实体对象的文件,以 /examples/Mysql 项目为例子,执行迁移后,将生成 Model/MysqlDbContext.cs,该文件即为上下文对象;相反的,可以使用了CodeFirst进行 Model 实体对象的迁移,MyStaging 会检查指定程序集的实体对象,当发现对象携带 TableAttribute 特性时,MyStaging会认为该对象参与迁移。

    [Table(name: "article", Schema = "mystaging")]
public partial class Article
{
[Column(TypeName = "tinyint(1)")]
public bool State { get; set; }
/// <summary>
/// 主键,自增
/// </summary>
[PrimaryKey(AutoIncrement = true)]
public int id { get; set; }
public int userid { get; set; }
public string title { get; set; }
public string content { get; set; }
public DateTime createtime { get; set; }
public string IP { get; set; }
}

属性迁移

迁移后的实体对象,都是分部类(partial),在有些情况下,我们需要在实体对象上增加一些影子属性,影子属性通常指数据库中存在的字段,而实体对象中并没有定义,反之一样。如果需要定义影子属性在实体对象中,你只需要在影子属性上增加特性 NotMappedAttribute 即可。

    [Table(name: "article", Schema = "mystaging")]
public partial class Article
{
[NotMapped]
public string IP { get; set; }
}

初始化数据库上下文

初始化 DbContext 上下文对象时,要求传入一个配置 StagingOptions,该 StagingOptions 包含了一些必须和可选的配置

public StagingOptions(string name, string master, params string[] slaves)

上面的 StagingOptions 构造函数中的参数表示: name=配置的名称,master=主数据库的连接字符串,slaves=从库的连接字符串(支持多个),其它没有出现在构造函数中的属性,表示可选参数,可选参数包含了 CacheOptions(缓存选项)和 Logger(日志组件),如果你配置了日志和缓存,MyStaging将在某些场景下启用该设置,比如针对查询单个对象的主键缓存,缓存还支持分布式缓存(IDistributedCache)

最终初始化上下文对象

    // 控制台应用程序
static void Main(string[] args)
{
var options = new MyStaging.Metadata.StagingOptions("MySql", "server=127.0.0.1;user id=root;password=root;database=mystaging");
var context = new MysqlDbContext(options);
} // Web应用程序
public void ConfigureServices(IServiceCollection services)
{
var options = new MyStaging.Metadata.StagingOptions("MySql", "server=127.0.0.1;user id=root;password=root;database=mystaging");
var context = new MysqlDbContext(options);
services.AddScoped(this.Configuration);
}

CURD合集

插入

此示例包含单次插入和批量插入

    var article = new Article()
{
content = "你是谁?你从哪里来?要到哪里去?",
createtime = DateTime.Now,
userid = customer.Id,
IP = "127.0.0.1",
State = true,
title = "振聋发聩的人生三问"
}; var list = new System.Collections.Generic.List<Article>();
for (int i = 0; i < 10; i++)
{
list.Add(article);
} // 单个插入
var newArticle = context.Article.Insert.Add(article);
// 批量插入
var affrows = context.Article.Insert.AddRange(list).SaveChange();

更新

与 EF 不同的是,MyStaging的更新采用无附加实体的方式,直接执行更新过程

    var article = context.Article.Update.SetValue(f => f.content, "未来已来,从这里开始").Where(f => f.id == 1001).SaveChange();

删除

删除和更新类似,都是直接执行

    context.Article.Delete.Where(f => f.id == 1001).SaveChange();

查询

查询比较复杂,不过基本和 EF 类似的语法

    // 单个查询
var article = context.Customer.Select.Where(f => f.Id == 2 && f.Name == "Ron").ToOne();
// 列表查询,排序、分页、分组
var articles = context.Customer.Select.OrderBy(f => f.Id).Page(1, 10).GroupBy("Name").ToList();
// 表连接查询
var article = context.Article.Select.InnerJoin<Customer>("b", (a, b) => a.userid == b.Id).Where<Customer>(f => f.Id == 2).ToOne();
// 首字段查询,ToScalar 参数可以传递 Sql 参数,比如 SUM(x)
var id = context.Customer.Select.Where(f => f.Id == 2 && f.Name == "Ron").ToScalar<int>("Id");

更多示例,请访问 /examples

项目地址:https://github.com/lianggx/mystaging

因为喜欢所以升级,MyStaging-3.0 继续的更多相关文章

  1. Asp.NetCore3.1开源项目升级为.Net6.0

    概述 自从.Net6.0出来后,一直想之前开发的项目升级.Net6.0,有时想想毕竟中间还跨了个5.0版本,升级起来不知道坑大不大,最近抽时间对升级的方案做了些研究,然后将代码升级为.Net6.0.本 ...

  2. ADT for Eclipse无法升级到23.0的解决方法(确保您的网络能够访问google的地址)

    进行以下步骤时,请确保您的网络能够访问google的地址,因为有可能是无法访问google地址导致无法升级,该文不是为了解决这个问题!!! 最近一次的升级,ADT无法从ADT 22.X升级到23.0. ...

  3. Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)

    Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8) 本次演示为升级oracle rac数据库,用GI的psu升级,从11.2.0.4.0升级到11.2.0.4.8 ...

  4. 系统补丁更新导致MVC3.0.0升级到3.0.1的问题解决

    在更新了系统补丁之后,会不知觉的将MVC3.0.0升级到MVC3.0.1的问题,解决的思路如下: 1.全部MVC引用使用NuGet进行包的管理. 2.单独把MVC库抽离出来,然后放在单独的项目文件夹, ...

  5. CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方

    问题一: document.forms1.action 不可使用 需要修改程 document.forms[0] .NET 程序框架 从2.0/3.5升级到4.0 版本后,document.forms ...

  6. foxmail 6.5升级到7.0版本后,旧邮件的导入处理

    随着foxmail 7.0版的火热升级,部分从foxmial 6.5版升级到7.0版的用户可能会出现旧邮件丢失的困扰.这里,foxmail为大家提供的解决方案如下:   打开Foxmail,点击 文件 ...

  7. xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题)

    xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题) 前两天为了适配 iOS10 的系统 我将xcode 7.3 升级到了 xcode 8.0 但是 ...

  8. 升级到tomcat7.0碰到的问题

    今天把tomcat从6.0.18升级到7.0.25,发现了两个问题 问题1 java.lang.ClassNotFoundException: org.apache.catalina.mbeans.S ...

  9. CentOS6.5升级为CentOS7.0

    CentOS6.5升级为CentOS7.0 CentOS6.5升级为CentOS7 升级前: [root@localhost ~]# cat /proc/version  Linux version ...

  10. IE升级到10.0,VS2010启动调试时报“未能将脚本调试器附加到计算机..”

    IE升级到10.0,VS2010启动调试时报“未能将脚本调试器附加到计算机..” 今天,在调试代码时,调试器弹出提示框,报:未能将脚本调试器附加到计算机XXX上的进程iexplore.exe . 已附 ...

随机推荐

  1. 用 npm 搭建vue项目

    一.开发环境 vue推荐开发环境: Node.js: javascript运行环境(runtime),不同系统直接运行各种编程语言 npm: Nodejs下的包管理器. webpack: 它主要的用途 ...

  2. 详述@Responsebody和HTTP异步请求的关系

    Map.ModelAndView.User.List等对象都可以作为返回值.上述这两种对象都可以使用此注解.使用此注解即表示是在同一次请求的响应体里返回.浏览器以异步http的方式来接收.比如后端的M ...

  3. 工业4.0:换热站最酷设计—— Web SCADA 工业组态软件界面

    前言 随着工业4.0的不断普及与发展,以及国民经济的飞速前进,我国的城市集中供热规模也不断扩大,科学的管理热力管网具有非常重大的经济和社会效益.目前热力系统,如换热站大都采用人工监控,人工监控不仅浪费 ...

  4. 慕课网--mysql开发技巧一 学习笔记

    现在存在下面的两张表,表的结构如下所示 师徒四人表结构:id,user_name,over数据:id user_name over1 唐僧 旃檀功德佛2 猪八戒 净坛使者3 孙悟空 斗战胜佛4 沙僧 ...

  5. 解决start.spring.io无法访问的情况

    将start.spring.io替换成下列网址 http://start.jetbrains.org.cn/ 或者----> 连接手机热点 因为绝大多数无法访问都是因为网络问题

  6. Python 简明教程 --- 12,Python 字典

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 代码写的越急,程序跑得越慢. -- Roy Carlson 目录 Python 字典是另一种非常实用 ...

  7. vue基础入门(2.2)

    2.2.基础指令 2.2.1.什么是指令 指令 (Directives) 是带有 v- 前缀的特殊特性,指令特性的值预期是单个 JavaScript 表达式,指令的职责是,当表达式的值改变时,将其产生 ...

  8. 如何用好 IDEA ,Java 撸码效率至少提升 5 倍?

    以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString:异常处理:I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运 ...

  9. SSTI-服务端模板注入

    SSTI-服务端模板注入漏洞 原理: 服务端模板注入是由于服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而导致了敏感信息泄露. ...

  10. DLL注入之修改PE静态注入

    DLL注入之修改PE静态注入 0x00 前言 我们要注入的的力量功能是下载baidu首页数据.代码如下: #include "stdio.h" #include"stdi ...