.Net Core建站(1):EF Core+CodeFirst数据库生成

emmm,原本想着用Core作一个小项目玩玩的,而后确定是要用到数据库的,html

而后想,啊,要不用CodeFirst,感受很腻害的样子,因而,一脸天真无邪的我就踏入了一个深不见底的天坑。。。web

 

原本想着,应该不是很难,多百度就好,辣么多大神都写了教程,数据库

零零散散的花了将近三个星期时间,照着Demo写了N屡次的我,不得不放弃了挣扎,ide

邀请了一位一块儿工做的大佬,看着他噼里啪啦调试了半个小时以后,就出现的数据库,莫名心塞,工具

大佬就是大佬,原谅小弟我才疏学浅,因此作一个笔记先,留着备用。。ui

 

我会边写博客,边作一个最简单的Demo,其实不少时候咱们缺的,就是这些入门级的东西,spa

那些加了各类验证和功能的代码,反而会影响咱们找到须要的代码。设计

 

工具:VS20173d

环境:.Net Core 2.0 ,EF7调试

 

首先,咱们须要的是建一个解决方案,一个类库项目,以及一个Web项目

这些建好以后的项目结构,应该是酱紫的

建好以后,就到了一个小关键了,咱们要添加EF的依赖了,怎么添加呢?

网上看了好多方法,基本是都是使用工具=>NuGet包管理=>程序包管理控制台,来添加依赖,大概是酱紫:

能够先开着,待会儿用得着,不过我觉着这样有点麻烦,因此直接写在项目的工程文件(*.csproj)里面去了,要写的代码以下

1   <ItemGroup>
2     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.1" />
3     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" />
4   </ItemGroup>

保存以后,Models的EF依赖就已经加入了,怎么知道是否成功呢?看这里,,,

之前是只有一个SDK的,如今多了个NuGet,里面还有俩东西,并且没有警告啊那些乱七八糟的东西,就表示没问题了,,

一样的,咱们为WebFront项目,也加上依赖,,这里就不截图了,,,

走到这一步,咱们就应该开始建立数据库的上下文和数据表了

 建立数据库的上下文类(DBCodeFirst)和数据表类(DT_User),结构以下

DBCodeFirst的内容以下:

 1     public class DBCoreFirst : DbContext
 2     {
 3         public DBCoreFirst() : base()
 4         {
 5 
 6         }
 7 
 8         public DBCoreFirst(DbContextOptions<DBCoreFirst> options)
 9             : base(options)
10         {
11 
12         }
13 
14         override protected void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
15         {
16             base.OnConfiguring(optionsBuilder);
17         }
18 
19         #region 数据表
20 
21         public DbSet<DT_User> DT_User { get; set; }
22 
23         #endregion
24 
25     }

DT_User的内容以下:

1     public class DT_User
2     {
3         /// <summary>
4         /// 默认int类型ID为主键
5         /// 必须有一个字段为主键,否则会报错
6         /// </summary>
7         public int ID { get; set; }
8         public string UserName { get; set; }
9     }

而后在WebFornt项目的Startup类的ConfigureServices方法中写一段代码,链接字符串中的DataBase写的数据库名称是啥,生成的数据库名称就是啥,能够和你的上下文类名称不一致

这时候,咱们再来看看数据库的状况,是没有DBCodeFirst这个库的

重头戏到了,还记得开始打开的程序包管理控制台么?

打开它,输入命令,Add-Migration *****(这块儿随意)

1 Add-Migration DBCoreFirst

在执行它的时候,我报了好几个错,一一列举出来

第一个报错

GenericArguments[0], 'Models.Migrations.DBCoreFirst', 
on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'.

genericarguments [ 0 ],”模型。迁移。dbcorefirst ','微软。entityframeworkcore。设计。idesigntimedbcontextfactory ` 1 [ tcontext ]“违背类型的tcontext约束。

这个报错的锅在图中,我用红框框起来的地方,默认项目 ,对,没错,就是它,应该改为WebFonrt,

改好以后,咱们继续执行Add-Migration DBCoreFirst

紧接着,报了第二个错 

Could not load assembly 'WebFront'. Ensure it is referenced by the startup project 'Models'.

未能加载程序集“webfront”。确保它由启动项目的“Models”引用。

这个报错的锅呢,看到我箭头的尾部了么,在哪里?是Models项目吧,如今这个项目是加粗的,表示它是启动项目,

更改启动项目为WebFornt项目,很好,第二个坑被我填了,继续运行Add-Migration DBCoreFirst

第三个坑接踵而至

Your target project 'WebFront' doesn't match your migrations assembly 'Models'. Either change your target project or change your migrations assembly.

你的目标项目webfront不迁移组件模型匹配”。要么更改目标项目,要么更改迁移程序集。

其实这个坑也不算大,强行往下走也是能生成数据库的,可是,对我这个强迫症来讲,哪里容得下飘红??

因而百度,查看了相关资料后,我知道问题出在了哪里,就是箭头尾部的第28行代码

services.AddDbContext<DBCoreFirst>(options => options.UseSqlServer(connection));
改成
services.AddDbContext<DBCoreFirst>(options => options.UseSqlServer(connection, c => c.MigrationsAssembly("WebFront")));

很好,没有飘红了,但是,在图中黄色框中,会对应的生成一些文件,

按个人理解,这些文件不是什么日志文件,就是用来数据表映射的,因此,这些文件应该出如今Models中,而不是WebFront

一系类百度后,,好像没找着,只能本身点点点,

发现了第四个坑

首先,将代码还原,

services.AddDbContext<DBCoreFirst>(options => options.UseSqlServer(conStr));不变

而后咱们回到第一个坑,将默认项目从“WebFront”改成“Models”

而后执行Add-Migration DBCoreFirst

很稳,如今四个地方都对了,而后咱们看看数据库,这个时候尚未生成对应的库

而后咱们执行第二段命令Update-DataBase

而后,幸运的我又遇到了第五个坑

GenericArguments[0], 'Models.Migrations.DBCoreFirst', 
on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'.

genericarguments [ 0 ],”模型。迁移。dbcorefirst ''微软。entityframeworkcore。
设计。idesigntimedbcontextfactory ` 1 [ tcontext ]“违背类型的tcontext约束。

 打开一个由命令生成的文件看看

 两个类的名称一毛同样,数据库又是根据DBCodeFirst这个类来生成的,不出问题就见鬼了,,

那么,左边的类名为何会和右边的同样??

问题在于咱们执行的“Add-Migration DBCoedFirst“命令

Add-Migration DBCodeFirst
改成
Add-Migration DBLog

执行以后的效果,很明显的变了

紧接着,执行命令“Update-DataBase

而后,咱们去数据库看看

很稳,数据库生成了,EF会自动生成__EFMigrationsHistory表,好像是用来记录数据迁移日志的,我们如今忽略就好

至此,EF7的CodeFirst生成数据库就完成了,,

自我感受,写完这一篇,我打马赛克的技术也愈来愈稳了,,,

相关文章
相关标签/搜索