ASP.NET Core:使用EntityFrameworkCore操作MySql来丰富仓储模块
概述
上一篇简单介绍了Dapper的基本用法,数据的存储为SqlServer。那么这一篇就记录一下使用EFCore来操作MySql的一些方式,这种模式比较适合那种一个项目中需要操作多种数据库的模式。不过因为微软官方并没有提供其驱动,所以我们需要借助MySql官方提供的驱动进行基本的增删改查操作。这样一来我们也可以将数据库迁移到Linux服务器上了,是不是很激动。当然了,Sql Server Love Linux!大家同样是有目共睹,SQL Server 2017 Preview版本也已经支持在Linux上部署,但是当我看到需要至少3.25G的内存的时候,我是有点小情绪的,有要了解的话大家可以移步这里,很期待微软下一步会有什么样的大动作!好了,正文开始。
一、在Windows上安装并配置MySql
1、先到官网上下载最新的发行版本5.7.18(社区版),选择mysql-installer-community-5.7.18.1.msi,因为它已经包含了Server和Workbench。
2、双击下载好的文件开始安装,这个版本的安装体验自我感觉已经比5.5的好了很多。如果嫌麻烦的话,你可以直接选择第一个选项“Developer Default”——默认的开发环境来进行安装,非常省事。不过我是一个.Netor,有些内容并不是必须的,所以我选择“Customer”自定义来进行安装了,接着下一步、
3、下面我列出来自定义选择的一些安装内容简介
MySQL Server | MySQL 服务器(必不可少,你懂的~) |
MySQL Workbench | MySQL的数据库建模工具(类似于SQL Server Management Studio) |
MySQL Notifier | MySQL的DBA辅助工具(安装好之后右下角会有一个小托盘) |
Connector/ODBC | 数据库与应用程序的互连标准 |
Connnector/NET | .NET程序的数据库驱动 |
其他一些高级功能比如MySQL Router,VS的可视化连接工具,Shell,文档介绍等等就暂时忽略,以后需要的话可以随时安装
4、接下来选择一个安装路径,然后点击Execute进行安装即可
5、服务器配置类型选择开发环境“Development Machine”,端口默认3306,然后下一步
6、然后给Root账户设置一个密码。其他账户你可以选择暂时不添加,继续下一步
7、将MySQL配置成一个Windows服务,并设置为开机启动
8、应用你的所有配置,并完成安装。整个过程耗时还是挺少的
9、启动MySQL,输入你刚才设置的root账户的密码进行登陆。出现以下页面,说明已经大功告成。
二、添加MySql.Data.EntityFrameworkCore到仓储模块
1、打开工具=》Nuget包管理器=》程序包管理控制台,输入以下命令进行包的安装,同时依赖也会跟着一起引入到项目中去
Install-Package MySql.Data.EntityFrameworkCore -Pre
几个注意点这里说明一下:
a)、通过Nuget包管理器界面进行安装的时候记得勾选“包括预发行版”,然后再进行搜索
b)、命令行记得带上“-Pre”,表示预发行版本
c)、安装的默认项目时选择仓储模块Light.Repository
2、构建MySQL数据库上下文,注意红色字体的描述
/// <summary>
/// MySQL数据库访问上下文
/// </summary>
public class LightContext : DbContext
{
public LightContext(DbContextOptions<LightContext> options)
: base(options)
{
} public DbSet<User> User { get; set; }
}
/// <summary>
/// MySQL的数据库配置
/// </summary>
public class MySQLDataBaseConfig
{
/// <summary>
/// 默认的MySQL的链接字符串
/// </summary>
private const string DefaultMySqlConnectionString = "server=localhost;userid=root;pwd=sasa;port=3306;database=light;";
public static LightContext CreateContext(string mySqlConnectionString = null)
{
if (string.IsNullOrWhiteSpace(mySqlConnectionString))
{
mySqlConnectionString = DefaultMySqlConnectionString;
}
var optionBuilder = new DbContextOptionsBuilder<LightContext>();
optionBuilder.UseMySQL(mySqlConnectionString);
var context = new LightContext(optionBuilder.Options);
context.Database.EnsureCreated();//针对当前访问的上下文对象,如果数据库中存在该表,则不做修改;否则的话进行创建
return context;
}
}
3、接下来就是用我们准备好的数据库上下文对用户进行简单的CRUD操作。因为得益于面向接口编程和DI的思想,只需要用EF的方式实现IUserRepository中定义的方法,然后将此注入仓储即可
/// <summary>
/// MySql中的用户仓储实现
/// </summary>
public class UserRepositoryMySql : IUserRepository
{
/// <summary>
/// 创建一个用户
/// </summary>
/// <param name="entity">用户</param>
/// <param name="connectionString">链接字符串</param>
/// <returns></returns>
public bool CreateEntity(User entity, string connectionString = null)
{
using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
{
context.User.Add(entity);
return context.SaveChanges() > ;
}
} /// <summary>
/// 根据主键Id删除一个用户
/// </summary>
/// <param name="id">主键Id</param>
/// <param name="connectionString">链接字符串</param>
/// <returns></returns>
public bool DeleteEntityById(int id, string connectionString = null)
{
using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
{
context.User.Remove(context.Find<User>(id));
return context.SaveChanges() > ;
}
} /// <summary>
/// 获取所有用户
/// </summary>
/// <param name="connectionString">链接字符串</param>
/// <returns></returns>
public IEnumerable<User> RetriveAllEntity(string connectionString = null)
{
using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
{
List<User> allUsers = new List<User>();
allUsers.AddRange(context.User);
return allUsers;
}
} /// <summary>
/// 根据主键Id获取一个用户
/// </summary>
/// <param name="id">主键Id</param>
/// <param name="connectionString">链接字符串</param>
/// <returns></returns>
public User RetriveOneEntityById(int id, string connectionString = null)
{
using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
{
return context.Find<User>(id);
}
} /// <summary>
/// 修改一个用户
/// </summary>
/// <param name="entity">要修改的用户</param>
/// <param name="connectionString">链接字符串</param>
/// <returns></returns>
public bool UpdateEntity(User entity, string connectionString = null)
{
using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString))
{
context.Update<User>(entity);
return context.SaveChanges() > ;
}
}
}
/// <summary>
/// 注入仓储层
/// </summary>
public class RepositoryInjection
{
public static void ConfigureRepository(IServiceCollection services)
{
//services.AddSingleton<IUserRepository, UserRepository>();
services.AddSingleton<IUserRepository, UserRepositoryMySql>();
}
}
4、至此,你上层的所有代码不用进行任何的变动,系统便从SqlServer切换到了MySql上。然后试着用API插入一个用户信息看看,是不是User表自动创建,并且产生了一条记录。
其实查看表结构不难发现,EF会默认将属性名为Id的int型作为主键,并且设置为自增。字符串string类型的话默认可空且长度为255,其他则非空。那么我们是否可以修改默认的表结构呢,答案肯定是:可以的
三、配置上下文中的数据库对象
1、在LightContext中重写模型绑定的方法OnModelCreating,然后设置对应实体属性的规则,这种方式叫做Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>(m =>
{
m.Property(n => n.UserName).HasMaxLength();//设置用户名最大长度为50个字符
m.Property(n => n.Password).HasMaxLength(20).IsRequired();//设置密码不可空且最大20个字符
});
base.OnModelCreating(modelBuilder);
}
2、本来想用Microsoft.EntityFrameworkCore.Tools结合dotnet ef相关命令直接进行更新数据库,但最后失败了
大致意思是说.NETStandard类库不适用此CLI,除非换成启动项目。然后查了下,官方也给出了解释
3、所以我这边偷了一个懒,直接删除刚刚生成的表,然后重新运行项目,这相当于重建了数据库表。接着查询下MySQL中User表的新结构,看看是不是已经发生了变化
四:总结
其实EF Core还有更多高级的用法,实体模型间的关系,数据库的迁移等等,需要我们更加深入的学习和实践。除了官方文档外,这里安利一个挺不错的学习网站:learnentityframeworkcore,那么就到这里了,共同进步!
ASP.NET Core:使用EntityFrameworkCore操作MySql来丰富仓储模块的更多相关文章
- .NET Core 使用Dapper 操作MySQL
MySQL官方驱动:http://www.cnblogs.com/linezero/p/5806814.html .NET Core 使用Dapper 操作MySQL 数据库, .NET Core 使 ...
- python操作三大主流数据库(1)python操作mysql①windows环境中安装python操作mysql数据库的MySQLdb模块mysql-client
windows安装python操作mysql数据库的MySQLdb模块mysql-client 正常情况下应该是cmd下直接运行 pip install mysql-client 命令即可,试了很多台 ...
- docker部署Asp.Net Core、Nginx、MySQL
2019/10/24,docker19.03.4, .netcore 3.0,CentOS7.6 摘要:asp.net core 3.0 网站项目容器化部署,使用docker-compose编排Ngi ...
- .net core使用orm操作mysql数据库
Mysql数据库由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库.MySQL是一个多用户.多线程的关系型数据库管理系 ...
- ASP.NET Core使用EPPlus操作Excel
1.前言 本篇文章通过ASP.NET Core的EPPlus包去操作Excel(导入导出),其使用原理与NPOI类似,导出Excel的时候不需要电脑上安装office,非常好用 2.使用 新建一个AS ...
- 在Linux CentOS上部署Asp.Net Core项目(Tengine、Asp.Net Core、Centos、MySql)
一.前言 1.简单记录一下Linux CentOS 7中安装与配置Tengine的详细步骤. 2.简单比较一下Tengine 和Nginx 3.搭建Asp.net Core和部署 Web程序 4.总结 ...
- Asp.net Core 使用 EntityFrameworkCore 1.1
前言 相比大家也在开发中是非常喜欢用ORM的.今天就来介绍一下EntityFrameworkCore的使用方法. 自从EF Core升级到1.1之后,确实变化挺大的.如果没试过真的不知道坑是挺多的.今 ...
- ASP.NET Core使用EntityFrameworkCore CodeFrist
1,安装环境: 如果是VS2015,确保已经升级至 update3或以上 .net core sdk (https://www.microsoft.com/net/download/core) vs2 ...
- Asp.Net Core 静态文件目录操作
一.默认静态文件处理 Asp.Net Core的默认处理方式,将所有的静态文件都放在wwwroot文件夹中 1.默认配置,在启动文件Startup中 public void Configure(IAp ...
随机推荐
- Angular.js学习笔记 (二)
用A链接对象解析url的组成 var url = 'https://www.baidu.com:8080/aaa/1.html?id=10#name'; var aLink = document.cr ...
- android studio 2.3 下载地址
android studio下载: Windows+SDK:(1.8GB)| Windows(428 MB) | Linux idea win.exe win.zip 序号 名称 中文 ...
- SIP DB33标准笔记 注册/目录发送/心跳
SIP协议扩展中: 在 RFC 3261 基础上定义了一个新方法 DO.方法 DO 的功能包括:控制对方动作.更新对方信息.查询对方状态.历史监控资料查询和回放等.发送方法 DO 的请求报文时,不会创 ...
- redis intset(整数集合)
redis intset (整数集合) 概述 intset 是集合的底层实现结构之一 intset 集合只包含整数 intset 自升级 intset 整数集合是有序的 intset 结构 结构 // ...
- ionic打包项目,运行时报错A problem occurred configuring root project 'android'。。。
运行报错的原因是sdk没有下载完整 解决办法: 1,打开sdk manage.分别下载android support repository.Google play services.google re ...
- seajs加载angularjs
angularjs是自动完成模块的控制的,而seajs加载模块是异步的,所以不做修改,直接seajs加载angularjs会出错. 在这里讲下自己的解决方法 一.需要把ng-ap ...
- vue2-loading-bar 一款基于Vue2的进度条插件
自学了N久vue,奈何没有练手项目,终于决心拿个东西来试试手.基于对音乐的热爱,选择的第一个demo是音乐播放器.一般播放器都有进度条,于是无意间找到这个插件,就是vue2-loading-bar,这 ...
- CentOS编译安装emacs并配置
Liunxs中CentOS系列一向以稳定为目标,然而也会存在版本太旧的问题,emacs就是其中的一个,目前emacs都发行到25.2了,而CentOS上的emacs版本却还是23.1.所以需要下载源代 ...
- 利用Python进行简单的图像识别(验证码)
这是一个最简单的图像识别,将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt ...
- WPF报表自定义通用可筛选列头-WPF特工队内部资料
由于项目需要制作一个可通用的报表多行标题,且可实现各种类型的内容显示,包括文本.输入框.下拉框.多选框等(自定的显示内容可自行扩展),并支持参数绑定转换,效果如下: 源码结构 ColumnItem类: ...