项目介入EF Core
目前.Net主流的ORM有SqlSugar、Entity Framework、Dapper,其它的我就不列举了。其实和Java那边ibatis相比,他们都比较轻量。之前用ibatis开发,真的很麻烦,而且在XML里面配置总感觉不太友好。
首先DbFirst模式,先在数据库建好表结构,然后在项目中生成实体。
引入包:Microsoft.EntityFrameworkCore.Tools、Microsoft.EntityFrameworkCore.Design、Pomelo.EntityFrameworkCore.MySql
写一个类继承于DbContext
public class MyContext : DbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options)
{
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
在ConfigureServices方法中写入下面这句代码
services.AddDbContext<MyContext>(options => options.UseMySql(Configuration.GetConnectionString("dbconn")));
在程序包管理控制台中输入命令:
Scaffold-DbContext "server=localhost;user id=root;password=zhang.1122;port=3306;database=MicroservicesCoreDB;Charset=utf8;SslMode=None" "Pomelo.EntityFrameworkCore.MySql" -OutputDir Models -Context MyContext -UseDatabaseNames
-OutputDir Models表示生成的实体类放在Models文件夹下
-Context MyContext表示生成的数据库上下文对象的名称
-UseDatabaseNames表示完全按照数据的字段名和表名来生成实体对象,如果不加这个,默认会帕斯卡命名
后续如果新加了表,执行下面这个命令:
Scaffold-DbContext -Force "Server=localhost;port=3306;database=MicroservicesCoreDB;uid=root;pwd=zhang.1122;CharSet=utf8" -Provider "Pomelo.EntityFrameworkCore.MySql" -OutputDir Models -Tables report -UseDatabaseNames
-Tables report表示指定要生成的表,如果有多个表可用逗号分隔
按照上面那条命令,每次都会生成一个DbContext对象,默认命名为数据库名+Context.每次都要删除重新生成的上下文对象很麻烦,所以有更便捷的命令
Scaffold-DbContext "Server=localhost;port=3306;database=MicroservicesCoreDB;uid=root;pwd=zhang.1122;CharSet=utf8" -Provider "Pomelo.EntityFrameworkCore.MySql" -OutputDir Models -Context MyContext -UseDatabaseNames -Force
-Force命令可以同步数据库表结构,但是数据库删除了一个表,项目中对应的实体类还会存在,需要手动删除.
在执行命令之前,先重新生成一下项目,如果有报错的话,会生成不成功的.
第二种是CodeFirst模式
新建一个类DbInitialize,用于生成数据库及种子数据
public class DbInitialize
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="dbcontext"></param>
/// <param name="isDbInitialize"></param>
public static void Initlialize(MyContext dbcontext, bool isDbInitialize)
{
if (isDbInitialize)
{
dbcontext.Database.EnsureDeleted();//删除
dbcontext.Database.EnsureCreated();//再创建
dbcontext.Department.Add(new Department
{
department_name= "开发部",
department_num= "2020001",
dt= DateTime.Now, remarks = "暂无", });
dbcontext.SaveChanges();//持久化
}
}
}
新建一个AppSettings类
public class AppSettings
{
public bool IsDbInitialize { get; set; }
}
在appsettings.json中添加节点
"AppSettings": {
"IsDbInitialize": false//是否开启数据库创建
}
在ConfigureServices注册
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyContext>(options => options.UseMySql(Configuration.GetConnectionString("dbconn")));
services.AddMvc(options =>
{
options.Filters.Add(typeof(GlobalExceptionFilter));
});
services.AddOptions();
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}
修改Configure方法
public void Configure(IApplicationBuilder app, IHostingEnvironment env, MyContext context, IOptions<AppSettings> appSettings)
{
app.UseAuthentication(); if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} DbInitialize.Initlialize(context, appSettings.Value.IsDbInitialize); //开启数据库脚本创建,谨慎!!! app.UseMvc();
}
这种每次都要删库,数据库连接字符串一定要检查好,以免误删别的库.
还有另外一种方法
修改Configure方法,加入以下代码
using (var scope = app.ApplicationServices.CreateScope())
{
var context= scope.ServiceProvider.GetService<MyContext>();
context.Database.EnsureCreated();//没有则自动创建数据库
}
第一次数据库没创建的时候,会自动创建数据库
后续如果新增或修改了实体,先执行add-migrate createxxxTable命令,在执行Update-Database createxxxTable即可,会自动生成一个迁移表,记录每一次的迁移。
我们也可以将EnsureCreated()改为Migrate(),这样每次只需执行add-migrate createxxxTable命令即可,无需执行Update-Database createxxxTable命令.
using (var scope = app.ApplicationServices.CreateScope())
{
var context = scope.ServiceProvider.GetService<DBContext>();
context.Database.Migrate() ;//执行迁移
}
对了,我们可以在DBContext类的OnModelCreating方法中注册实体与数据库的映射关系,会根据映射关系生成对应的数据库表结构.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region
modelBuilder.ApplyConfiguration(new DepartmentEntityTypeConfiguration());
#endregion
base.OnModelCreating(modelBuilder);
}
class DepartmentEntityTypeConfiguration : IEntityTypeConfiguration<Department>
{
public void Configure(EntityTypeBuilder<Department> builder)
{
//定义主键
builder.HasKey(p => p.Id);
builder.ToTable("department");
builder.Property(p => p.department_name).HasMaxLength();
builder.Property(p => p.department_num).HasMaxLength();
builder.Property(p => p.remarks).HasMaxLength();
builder.Property(p => p.dt);
}
}
如有不足,望见谅!
项目介入EF Core的更多相关文章
- 如何使用ASP.NET Core、EF Core、ABP(ASP.NET Boilerplate)创建分层的Web应用程序(第一部分)
本文是为了学习ABP的使用,是翻译ABP官方文档的一篇实战教程,我暂时是优先翻译自己感兴趣或者比较想学习的部分,后续有时间希望能将ABP系列翻译出来,除了自己能学习外,有可能的话希望帮助一些英文阅读能 ...
- 最新版的EF Core对UWP支持的怎么样
为啥写这篇帖子呢?其实是因为翻微软的文档中心偶然翻到的,于是就出于好奇就试试了,看看用着怎么样. 以前没注意图片,所以我今天发现的时候,显示EF Core3.1支持standard2.0,于是就想试试 ...
- [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- asp.net core 实战项目(一)——ef core的使用
数据库设计 数据结构图如下: 此次实例比较简单,暂时只设计到上述3张表 SMUser:用于存储用户信息. Role:用于存储角色信息. SMUser_Role:用建立用户和角色关系的一直关联表. ...
- 使用Asp.Net Core MVC 开发项目实践[第二篇:EF Core]
在项目中使用EF Core还是比较容易的,在这里我们使用的版本是EF Core 2.2. 1.使用nuget获取EF Core包 这个示例项目使用的是SQLSERVER,所以还需要下载Microsof ...
- Asp.Net Core 2.0 项目实战(4)ADO.NET操作数据库封装、 EF Core操作及实例
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
- .Net Core2.2 + EF Core + DI,三层框架项目搭建教程
笔记: 近两年.Net Core发展的很快,目前最新版为3.0预览版,之前在网上买了一本1.1版书籍都还没来得及看呢,估计现在拿出来看也毫无意义了.已多年.net工作经验,看书不如直接实际上手来得快, ...
- ASP.NET Core MVC+EF Core项目实战
项目背景 本项目参考于<Pro Entity Framework Core 2 for ASP.NET Core MVC>一书,项目内容为party邀请答复. 新建项目 本项目开发工具为V ...
随机推荐
- PHP is_null() 函数
is_null() 函数用于检测变量是否为 NULL.高佣联盟 www.cgewang.com PHP 版本要求: PHP 4 >= 4.0.4, PHP 5, PHP 7 语法 bool is ...
- 小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令
这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀. 1.[BX]的概念 [BX]和[0]类似 ...
- 获取判断IE版本 TypeError: Cannot read property 'msie' of undefined
注意:以下方法只适用于IE11 以下: TypeError: Cannot read property 'msie' of undefined jquery1.9去掉了 $.browser 所以报错 ...
- Go语言系列(三)之数组和切片
<Go语言系列文章> Go语言系列(一)之Go的安装和使用 Go语言系列(二)之基础语法总结 1. 数组 数组用于存储若干个相同类型的变量的集合.数组中每个变量称为数组的元素,每个元素都有 ...
- mongodb 4.0副本集搭建
近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1. 准备工作 1.1 下载软件 选择版本并下 ...
- java基础之字符串
以下内容摘自<java编程思想>第十三章. 1. 不可变 String String 对象是不可变对象,String 类中每一个看起来会修改 String 值的方法,实际上都是创建了一个全 ...
- C#LeetCode刷题之#888-公平的糖果交换(Fair Candy Swap)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3758 访问. 爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝 ...
- 《闲扯Redis十》Redis 跳跃表的结构实现
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- PostgreSQL在没有备份情况下误删除Clog恢复
创建实验表postgres# create table t (n_id int primary key,c_name varchar(300));CREATE TABLEpostgres# inser ...
- 悄咪咪提高团队幸福感 & Surprise!
前言 本文的灵感是在几个月以前工作不忙(摸鱼)时想到的,老是自己一个人往前冲冲冲也没啥意思,需要想一点办法,来提高团队的效率,提高团队的幸福感(效率起来了,单位时间内代码写的更多,那不就幸福啦 ),经 ...