EFCore CodeFirst 适配数据库
EF6中可以直接根据代码模型生成数据库Database.SetInitializer即可
在EFCore中如何实现呢?
这项功能放在了DatabaseFacade对象中,传入数据库上下文对象实例化到一个DatabaseFacade对象
可以看到DatabaseFacade有几个方法:
获取所有迁移的migraion数据:GetMigrations
获取待迁移的migration数据 :GetPendingMigrations
获取已经操作的migration数据:GetAppliedMigrations
适配migration: Migrate
这中间有一个坑:efcore 貌似还不能根据模型生成数据库,而是要先添加migrations的文件,然后才能适配数据库
这里我添加了一个XXXX字段,按照正常的流程:我们需要执行命令:
dotnet ef migrations add addxxxxxx
dotnet ef database update

EFCore中的自动适配数据库的前提是添加好 新增变量的migrations文件,实际上只是efcore只帮助了我们实现了dotnet ef database update的操作
首先先操作下:dotnet ef migrations add addxxxxxx

这里我写了一个简单的中间件来说明下:

通过注册服务,添加usermap引用
/// <summary>
/// liyouming add 20180508
/// </summary>
/// <typeparam name="T">(context)上下文对象</typeparam>
/// <param name="service">扩展服务</param>
/// <param name="optionsAction">配置</param>
/// <returns></returns>
public static IServiceCollection AddEFMigrations<T>(this IServiceCollection service, Action<DbContextOptionsBuilder> optionsAction) where T : DbContext
{
service.AddDbContext<T>(optionsAction);
var serviceProvider = service.BuildServiceProvider();
service.AddSingleton<IEFMigrationsContext>(new EFMigrationsContext(serviceProvider.GetRequiredService(typeof(T)) as DbContext));
return service;
}
这里我们需要指导上下文对象T,并将该对象放到自定义的服务 IEFMigrationsContext 去处理下
然后扩展下IApplicationBuilder
public static IApplicationBuilder UseEFMigraions(
this IApplicationBuilder builder,string pathstring)
{
builder.Map(new Microsoft.AspNetCore.Http.PathString(pathstring), app => {
app.UseMiddleware<EFMigrationsMiddleware>(pathstring);
});
return builder;
}
比较简单,需要map下地址,当我们访问的时候进入到固定页面操作
public class EFMigrationsMiddleware
{
private readonly RequestDelegate _next;
private readonly string _pathstring;
private IEFMigrationsContext _migrationsContext; public EFMigrationsMiddleware(RequestDelegate next, string pathstring, IEFMigrationsContext migrationsContext)
{
if (next == null)
{
throw new Exception(nameof(next));
}
_next = next;
_pathstring = pathstring;
_migrationsContext = migrationsContext; } public async Task Invoke(HttpContext context)
{
if (context.Request.PathBase == _pathstring)
{
var list = _migrationsContext.GetPendingMigrations();
_migrationsContext.AutoMigration();
string strli = string.Empty;
foreach (var item in list)
{
strli += "<li>" + item + "</li>";
}
await context.Response.WriteAsync("<html><body><ul>" + strli + "</ul></body></html>");
}
else
{
await _next(context);
}
return; }
}
下面直接实现接口方法就ok了,存在待更新的migrations就执行更新
public void AutoMigration()
{
if (databaseFacade.GetPendingMigrations().Any())
{
//执行迁移
databaseFacade.Migrate();
} }
下面来说下使用方式:跟原有的dbcontext使用方式一样,配置好你的上下文对象配置
注册服务:
services.AddEFMigrations<UserDbContext>(optionsBuilder =>
{
var _userappsetting = Configuration.Get<UserAppSetting>();
if (_userappsetting == null)
{
throw new Exception("数据库连接字符串未配置");
}
switch (_userappsetting.DbType)
{
case : optionsBuilder.UseSqlServer(_userappsetting.UserConnectionString, sqlserver =>
{
sqlserver.MigrationsAssembly(_migrationAssablyName);
sqlserver.UseRelationalNulls();
sqlserver.UseRowNumberForPaging(); });
break;
case :
optionsBuilder.UseMySQL(_userappsetting.UserConnectionString, mysql =>
{
mysql.MigrationsAssembly(_migrationAssablyName);
mysql.UseRelationalNulls();
});
break;
default:
optionsBuilder.UseSqlServer(_userappsetting.UserConnectionString, sqlserver =>
{
sqlserver.MigrationsAssembly(_migrationAssablyName);
sqlserver.UseRelationalNulls();
sqlserver.UseRowNumberForPaging();
});
break;
}
});
AddEFMigrations
添加Configure
app.UseEFMigraions("/Migrations");
下面访问下:/Migrations ,这里上面的代码中我先获取了待更新的migraions 方便验证,这里可以看到待验证的migraions是我新添加 addxxxxxxx

下面我们来检查数据生成情况:
已经生成了 XXXXX字段
如果能不操作dotnet ef migrations add addxxxxxx就好了,感觉还是有点鸡肋~~~
EFCore CodeFirst 适配数据库的更多相关文章
- EF CodeFirst 创建数据库
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 话说EF支持三种模式:Code First M ...
- NetCore2.0下使用EF CodeFirst创建数据库
本文所使用的VS版本:VS2017 15.3.0 首先新建一个.net core项目 取名NetCoreTask 使用模型视图控制器方式 新建Model层 在Model层下新建一个user实体类 1 ...
- 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)
原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- 一个支持DbFirst、ModelFirst和CodeFirst的数据库小工具DbTool
DbTool 一个支持DbFirst.ModelFirst和CodeFirst的数据库工具. 简介 这是一个针对 SqlServer 数据库和 C# 开发语言的小工具,可以利用这个小工具生成数据库表对 ...
- .NetCore 使用Jenkins发布多环境下的项目并适配数据库EFCore数据库更新及替换配置文件
说明 1.git上的配置地址可能都是本地环境,提交到git server后怎么来使用发布不同环境? 2.关于EFCore本地数据库有更新的情况 添加了 Migrations文件 怎么在构建的时候去更新 ...
- EFCore CodeFirst模型迁移生成数据库备注(mysql)
重写Mysql下sql脚本生成器 using Framework.NetCore.Extensions; using Framework.NetCore.Models; using Microsoft ...
- 使用EF CodeFirst 创建数据库
EntityFramework 在VS2015添加新建项时,选择数据->ADO.NET 实体数据模型,有一下选项 来自数据库的EF设计器,这个就是我们最常用的EntityFramework设计模 ...
- asp.net mvc CodeFirst模式数据库迁移步骤
利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了. 但是,我有新的类要加入,有字段需要修改,那怎么办呢,删库,跑路 ? 哈哈 利用数据库迁 ...
随机推荐
- 【bzoj3172】 Tjoi2013—单词
http://www.lydsy.com/JudgeOnline/problem.php?id=3172 (题目链接) 题意 $n$个单词组成文本,问每个单词在文本中出现了几次. Solution 题 ...
- 五、spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate
1.pom添加依赖 <!-- spring data jpa,会注入tomcat jdbc pool/hibernate等 --> <dependency> <group ...
- TensorFlow最佳实践样例
以下代码摘自<Tensor Flow:实战Google深度学习框架> 本套代码是在 http://www.cnblogs.com/shanlizi/p/9033330.html 基础上进行 ...
- 假装会python--爬取贴吧正文
贴吧的老历史想存下来,强行python爬取一波 队友太强,躺好别动,偶尔做点副业 假装会python 基本流程: 1.爬取页面,获取页面的html源码 2.分析源码 通过正则表达式 匹配到想要的内容 ...
- 洛谷P1140 相似基因 (DP)
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
- 用rem来做响应式开发(转)
由于最近在做公司移动项目的重构,因为要实现响应式的开发,所以大量使用到了rem的单位,觉得这个单位有点意思.但是现在貌似用他的人很少.上一篇文章我分享了淘宝写的一篇rem的介绍,介绍的非常全面,但是他 ...
- HTML培训课程-------Day02(表格和框架)
表格 在网页中表格是一种经常使用到得设计结构,就像表格的内容中可以包含任何的数据,如文字.图像.表单.超链接.表格等等,所有在HTML中可以使用的数据,都可以被设置在表格中,所以有关表格设置的标记与属 ...
- 转iOS UIAppearance使用详解
iOS5及其以后提供了一个比较强大的工具UIAppearance,我们通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格,它提供如下 ...
- 【学习笔记】Spring AOP注解使用总结
Spring AOP基本概念 是一种动态编译期增强性AOP的实现 与IOC进行整合,不是全面的切面框架 与动态代理相辅相成 有两种实现:基于jdk动态代理.cglib Spring AOP与Aspec ...
- BAT及各大互联网公司2014前端笔试面试题--JavaScript篇(昨天某个群友表示写的简单了点,然后我无情的把他的抄了一遍)
(某个群友)http://www.cnblogs.com/coco1s/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大 ...