.Net Core建站(2):EF Core+CodeFirst数据库迁移
上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库,
其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,,
1.读取配置文件,获得链接字符串
2.使用数据库进行增删查改
3.实体类更新后,数据库也更新
一、读取配置文件,获得链接字符串
上一篇我们的链接字符串是这样写的

直接写在程序里面是非常非常不好的行为,所以我很简单粗暴的丢到appsettings.json这个配置文件里面去了,,
 {
   "Logging": {
     "IncludeScopes": true,
     "LogLevel": {
       "Default": "Warning"
     }
   },
   "ConStr": "server=.;Database=DBCodeFirst;uid=sa;pwd=12346"
 }
接下来,要愁的是怎么把配置读出来,而且,既然是配置文件,肯定整个项目都要用上,肯定是要封装起来的,
网上也找了很多啊,各种各样的, 有些大佬还可以直接读取成一个对象,这里我不搞那些骚操作啊,,,emmm,不会告诉你们我看不懂的
走最简单的,键值对,就像以前读取webconfig文件一样,
首先需要引用三个包,直接右键编辑commom.csproj:
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" />

然后新建一个类Config:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System;
using System.Diagnostics; namespace Common
{
/// <summary>
/// 配置类
/// </summary>
public class Config
{
/// <summary>
/// 所有的配置数据
/// </summary>
private static IConfigurationRoot Configuration { get; set; } /// <summary>
/// 获得数据
/// </summary>
/// <param name="_Configuration"></param>
public static void SetConfig(IConfigurationRoot _Configuration)
{
Configuration = _Configuration;
} /// <summary>
/// 返回对应键的值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key">键</param>
/// <param name="def">默认值</param>
/// <returns></returns>
public static T GetVal<T>(string key, T def = default(T))
{
try
{
def = (T)Convert.ChangeType(Configuration.GetSection(key).Value, typeof(T));
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
}
return def;
} } }
然后还要进行一下配置,在Startup.cs文件的Startup方法改造一下:
public Startup(IConfiguration configuration)
{
IConfigurationRoot config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build(); Config.SetConfig(config);
}
使用方法很简单的,一句话就好:
// 数据库连接字符串
string conStr = Config.GetVal<string>("ConStr");
因为现在的配置文件是json格式,所以,层级结构是肯定会有的,比如说,我现在要读取Logging下的IncludeScopes值,可以这样写:
          string IncludeScopes = Config.GetVal<string>("Logging:IncludeScopes");
以此类推,,,这样肯定没其他大佬们直接读取成对象来得快,不过好在简单易懂,以后等我学会了那种高大上的方法再来分享,,现在先就酱紫用着,,
二、使用数据库进行增删查改
这一段主要是吐槽,,
以前我们使用EF,不管是DBFirst还是CodeFirst,亦或者ModelFirst,要使用数据库都是很简单粗暴的new一个上下文对象
1 // 数据库上下文
2 var DB=new DBCodeFirst();
然鹅!!!!!!!当我用CodeFirst把数据库生成以后,喜滋滋的跑过去加一条测试数据,
public IActionResult Index()
{
DBCodeFirst db = new DBCodeFirst();
db.DT_User.Add(new DT_User { UserName = "嘿嘿" });
var count = db.SaveChanges(); return View(); }
他丫的给我报错,,,

翻译过来就是这个,,
没有数据库提供商已为这个DbContext。
一个供应商可以通过重写dbcontext.onconfiguring方法或使用adddbcontext对应用服务提供商配置。
如果adddbcontext使用,并确保你的DbContext类型构造函数接受dbcontextoptions < tcontext >对象并将其传递给DbContext基构造函数。”
反正我是没看懂的,,,永远不知道当时我的心情是多么的难受,
又是一阵百度啊,可算是被我找到解决方法了,,,得这样写:

讲真,我还没接触到依赖注入,所以这段代码看的是有点懵逼的,
好像关联的是Startup这个类里面的ConfigureServices方法,哪位大佬有兴致的话可以给我留言讲讲,感激不尽
不过好歹是可以用数据库了,,下一步是搭一个三层,,一筹莫展ing,,,
以前是可以直接new上下文,现在不行了,还不知道这个依赖注入能不能在其他层使用,,
等我把三层整出来之后,再写出来分享吧,,估计是下一篇了
三.实体类更新后,数据库也更新
这个的话首先回顾上一篇啊,
在上一篇里面用了两个命令来生成数据库(DBLog我改成Init了,,这个随意,,)
Add-Migration Init
和
Update-DataBase Init
如果在上下文中加了实体类或者修改了实体类字段,我们肯定是要更新数据库的,
这个时候,我们在已经生成数据库和Migrations文件夹的前提下,继续使用上面的两个命令
不过这个时候要稍稍改动:
Add-Migration UpData
和
Update-DataBase UpData
记得每次使用的时候,最后一个参数名称千万不能一样
就像我第一次使用的名称是Init 第一次更新数据库的时候,使用的是UpData
以后肯定还会有更多的更新,每次都不能一样,比如:UpData01、UpData02、UpData03、...
同时Migrations文档会对应的增加内容

数据库自动生成的__EFMigrationsHistory表中也会有我们的数据库迁移记录

emmm,差不多就这些吧,,,
我还得想办法把三层整出来,,,,脸滚键盘.gif
.Net Core建站(2):EF Core+CodeFirst数据库迁移的更多相关文章
- .Net Core建站(3):搭建三层架构
		啊,终于到写三层架构的时候了,老实说,我都不知道自己这个算不算三层架构,姑且就当它是吧,具体属于哪一个体系,希望有大佬指点一下(^o^)/ 不晓得有人注意到没有,我写了三篇博客,然后就改了三次标题ヽ( ... 
- ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First
		ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ... 
- ASP.NET Core 开发 - Entity Framework (EF) Core
		EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ... 
- .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介
		.NET Core 1.0.ASP.NET Core 1.0和EF Core 1.0简介 英文原文:Reintroducing .NET Core 1.0, ASP.NET Core 1.0, and ... 
- [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
		Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ... 
- 【.Net Core 学习系列】-- EF Core 实践(Code First)
		一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二解决方案: 新建项目: File --> New --> Project --> ... 
- 【.Net Core 学习系列】-- EF Core实践(DB First)
		一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二.准备数据: CREATE DATABASE [Blogging]; GO USE [Blogging ... 
- 在Asp.Net Core 5 中使用EF Core连接MariaDB
		升级到Asp.Net Core 5,使用EF Core连接MariaDB,使用的Nuget包Pomelo.EntityFrameworkCore.MySql也升级到了5.0.0-alpha.2,然后发 ... 
- 在ASP.NET MVC5 及 Visual Studio 2013 中为Identity账户系统配置数据库链接及Code-First数据库迁移
		在ASP.NET MVC5 及 Visual Studio 2013 中为Identity账户系统配置数据库链接及Code-First数据库迁移 最近发布的ASP.NET MVC 5 及Visual ... 
随机推荐
- codeforces 600E E. Lomsat gelral (线段树合并)
			codeforces 600E E. Lomsat gelral 传送门:https://codeforces.com/contest/600/problem/E 题意: 给你一颗n个节点的树,树上的 ... 
- SRTE测试
			网络拓扑: XRV1 ======================================================================= hostname XRV1expl ... 
- Vijos1774  机器翻译 [模拟]
			1.题意:给定一段长度为N个单词的文章(一个单词用一个非负整数表示),可以使用一个容量为M个元素的容器.你的任务是使用字典的帮助翻译文章,遇到一个单词,查询之后将此单词的释义放入容器中,下次遇到时若此 ... 
- Ubuntu14.04虚拟机下基本操作(typical安装)
			1.打开终端:ctrl+alt+T 2.图形桌面和命令行界面切换:Ctrl+Alt+F1和Ctrl+Alt+F7 3.切换到root用户:激活前,sudo su+回车: 激活后,su+回车. 切换回 ... 
- CentOS 7 端口白名单设置
			# 查看白名单列表 firewall-cmd --zone=public --list-ports # 添加白名单端口 firewall-cmd --zone=public --add-port=/t ... 
- python知识点总结02(不定时更新)
			请用至少两种方式实现m与n值交换m=10,n=5 # 方式一 temp = 0 m = 10 n = 5 print(f'方式一交换前,m:{},n:{}') temp = m m = n n = t ... 
- java项目中rmi远程调用实例
			1.创建一个学生实体类Student.java: package com.RMIdemo.entity; @SuppressWarnings("serial") public cl ... 
- springboot 文件上传及java使用post请求模拟文件上传
			参考自:https://blog.csdn.net/qq_25958999/article/details/83988974 接收端Controller类中方法: @RequestMapping(va ... 
- iptables限速
			####限速 限制指定时间包的允许通过数量及并发数-m limit --limit n/{second/minute/hour}:指定时间内的请求速率"n"为速率,后面为时间分别为 ... 
- 【题解】毒蛇越狱(FWT+容斥)
			[题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ... 
