.Net Core建站(2):EF Core+CodeFirst数据库迁移

上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库,html

其实还有好多问题的,此次一点一点的解决吧,都挺简单,不过零零散散的,,web

1.读取配置文件,得到连接字符串数据库

2.使用数据库进行增删查改json

3.实体类更新后,数据库也更新app

 

1、读取配置文件,得到连接字符串

上一篇咱们的连接字符串是这样写的函数

直接写在程序里面是很是很是很差的行为,因此我很简单粗暴的丢到appsettings.json这个配置文件里面去了,,测试

1 {
2   "Logging": {
3     "IncludeScopes": true,
4     "LogLevel": {
5       "Default": "Warning"
6     }
7   },
8   "ConStr": "server=.;Database=DBCodeFirst;uid=sa;pwd=12346"
9 }

接下来,要愁的是怎么把配置读出来,并且,既然是配置文件,确定整个项目都要用上,确定是要封装起来的,ui

网上也找了不少啊,各类各样的, 有些大佬还能够直接读取成一个对象,这里我不搞那些骚操做啊,,,emmm,不会告诉大家我看不懂的spa

走最简单的,键值对,就像之前读取webconfig文件同样,翻译

首先须要引用三个包,直接右键编辑commom.csproj

1     <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
2     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
3     <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" />

而后新建一个类Config

 1 using Microsoft.Extensions.Configuration;
 2 using Microsoft.Extensions.DependencyInjection;
 3 using Microsoft.Extensions.Options;
 4 using System;
 5 using System.Diagnostics;
 6 
 7 namespace Common
 8 {
 9     /// <summary>
10     /// 配置类
11     /// </summary>
12     public class Config
13     {
14         /// <summary>
15         /// 全部的配置数据
16         /// </summary>
17         private static IConfigurationRoot Configuration { get; set; }
18 
19         /// <summary>
20         /// 得到数据
21         /// </summary>
22         /// <param name="_Configuration"></param>
23         public static void SetConfig(IConfigurationRoot _Configuration)
24         {
25             Configuration = _Configuration;
26         }
27 
28         /// <summary>
29         /// 返回对应键的值
30         /// </summary>
31         /// <typeparam name="T"></typeparam>
32         /// <param name="key"></param>
33         /// <param name="def">默认值</param>
34         /// <returns></returns>
35         public static T GetVal<T>(string key, T def = default(T))
36         {
37             try
38             {
39                 def = (T)Convert.ChangeType(Configuration.GetSection(key).Value, typeof(T));
40             }
41             catch (Exception e)
42             {
43                 Debug.WriteLine(e.Message);
44             }
45             return def;
46         }
47 
48     }
49 
50 }

而后还要进行一下配置,在Startup.cs文件的Startup方法改造一下:

1         public Startup(IConfiguration configuration)
2         {
3             IConfigurationRoot config = new ConfigurationBuilder()
4                   .SetBasePath(Directory.GetCurrentDirectory())
5                   .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
6                   .Build();
7 
8             Config.SetConfig(config);
9         }

使用方法很简单的,一句话就好:

1         // 数据库链接字符串
2         string conStr = Config.GetVal<string>("ConStr");

由于如今的配置文件是json格式,因此,层级结构是确定会有的,好比说,我如今要读取Logging下的IncludeScopes值,能够这样写:

1          string IncludeScopes = Config.GetVal<string>("Logging:IncludeScopes");

以此类推,,,这样确定没其余大佬们直接读取成对象来得快,不过好在简单易懂,之后等我学会了那种高大上的方法再来分享,,如今先就酱紫用着,,

2、使用数据库进行增删查改

这一段主要是吐槽,,

之前咱们使用EF,不论是DBFirst仍是CodeFirst,亦或者ModelFirst,要使用数据库都是很简单粗暴的new一个上下文对象

1    // 数据库上下文
2    var DB=new DBCodeFirst();

然鹅!!!!!!!当我用CodeFirst把数据库生成之后,喜滋滋的跑过去加一条测试数据,

1         public IActionResult Index()
2         {
3             DBCodeFirst db = new DBCodeFirst();
4             db.DT_User.Add(new DT_User { UserName = "嘿嘿" });
5             var count = db.SaveChanges();7             return View();
8 
9         }

他丫的给我报错,,,

翻译过来就是这个,,

没有数据库提供商已为这个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

之后确定还会有更多的更新,每次都不能同样,好比:UpData0一、UpData0二、UpData0三、...

同时Migrations文档会对应的增长内容

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

emmm,差很少就这些吧,,,

我还得想办法把三层整出来,,,,脸滚键盘.gif

相关文章
相关标签/搜索