emmm,本来想着用Core做一个小项目玩玩的,然后肯定是要用到数据库的,

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

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

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

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

大佬就是大佬,原谅小弟我才疏学浅,所以做一个笔记先,留着备用。。

我会边写博客,边做一个最简单的Demo,其实很多时候我们缺的,就是这些入门级的东西,

那些加了各种验证和功能的代码,反而会影响我们找到需要的代码。

工具:VS2017

环境:.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

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

第一个报错

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

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

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

改好之后,我们继续执行Add-Migration DBCoreFirst

紧接着,报了第二个错 

  1. Could not load assembly 'WebFront'. Ensure it is referenced by the startup project 'Models'.
  2.  
  3. 未能加载程序集“webfront”。确保它由启动项目的“Models”引用。

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

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

第三个坑接踵而至

  1. Your target project 'WebFront' doesn't match your migrations assembly 'Models'. Either change your target project or change your migrations assembly.
  2.  
  3. 你的目标项目webfront不迁移组件模型匹配”。要么更改目标项目,要么更改迁移程序集。

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

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

  1. services.AddDbContext<DBCoreFirst>(options => options.UseSqlServer(connection));
  2. 改为
  3. 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

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

  1. GenericArguments[], 'Models.Migrations.DBCoreFirst',
  2. on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'.
  3.  
  4. genericarguments [ ],”模型。迁移。dbcorefirst ','微软。entityframeworkcore
  5. 设计。idesigntimedbcontextfactory ` [ tcontext ]“违背类型的tcontext约束。

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

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

那么,左边的类名为什么会和右边的一样??

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

  1. Add-Migration DBCodeFirst
  2. 改为
  3. Add-Migration DBLog

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

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

然后,我们去数据库看看

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

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

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

使用.Net Core+EF7 完成CodeFirst的更多相关文章

  1. 使用.Net Core+EF7 CodeFirst(2)

    上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...

  2. ASP.NET Core 3.0 WebApi 系列【2】.Net Core 3.0+ CodeFirst + MySql 实现数据的迁移

    写在前面 在前一小节中,我们创建了基于RESFULL风格的服务.这个小节,尝试使用CodeFirst+MySql 的方式实现数据迁移. 一.开发环境 [1]运行环境:win10 家庭版 [2]开发工具 ...

  3. 【原创】EntityFramework Core 中使用 CodeFirst 模式时 PowerShell 版本问题及解决

    一.描述: 在使用 Entity Framework Core 时,使用 CodeFirst 模式, 在 VS 中的 PMC(nuget 包管理 控制台) 控制台界面使用如下命令: Install-P ...

  4. 第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例)

    一. EF简介 1. 定义 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台的数据访问技术,它还是一种对象关系映射器(ORM),它使.NET 开发人员能够使用面向对 ...

  5. MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

    dotnet core 2.0 发布已经好几天了,期间也把原来 dotnet core 1.1 的 MVC 项目升级到了 2.0,升级过程还是比较顺利的,变动也不是太多.升级的过程中也少不了 Enti ...

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

    emmm,本来想着用Core做一个小项目玩玩的,然后肯定是要用到数据库的, 然后想,啊,要不用CodeFirst,感觉很腻害的样子,于是,一脸天真无邪的我就踏入了一个深不见底的天坑... 本来想着,应 ...

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

    上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...

  8. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. EntityFramework Core使用PostgreSQL

    EntityFramework Core使用PostgreSQL 0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用 ...

随机推荐

  1. 使用gitbook

    前面的话 gitbook功能强大,可以自动实现搜索及翻页等功能,上手容易,用markdown书写即可,且可以自动生成响应式网站.本文将详细介绍如何使用gitbook 安装 1.使用npm全局安装git ...

  2. 脑残手贱:被NFS祸害的调度系统

    建议:任何时候,都要三思而后行!!! 事请的缘由 系统中采用slurm调度系统来进行并行计算.但是在GPU节点上,无论如何都无法启动slurmd,报插件初始化错误的故障. 因此需要编译新的munge和 ...

  3. PAT-甲级-1003

    一.看题,https://www.patest.cn/contests/pat-a-practise/1007 其实,也是一顿暴力,但是最后一个测试点会运行超时,最开始,计算一段区间的值的总和的时候, ...

  4. yum常用选项和参数

    列举包文件 # yum list #列出资源库中所有可以安装或更新的rpm包 # yum list updates #列出资源库中所有可以更新的rpm包 # yum list installed #列 ...

  5. 蓝桥杯之K好数

    如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.3 ...

  6. 【收藏】Web前端开发第三方插件大全

    收集整理了一些Web前端开发比较成熟的第三方插件,分享给大家. ******************************************************************** ...

  7. 在.csproj文件中增加npm, bower, gulp, webpack的构建

    <Target Name="RunNpm" AfterTargets="AfterBuild">   <!-- As part of publ ...

  8. Sqlserver将数据从一个表插入到另一个表

    .如果是整个表复制表达如下: insert into table1 select * from table2 .如果是有选择性的复制数据表达如下: insert into table1(column1 ...

  9. 约瑟夫环C#解决方法

    /*约瑟夫环 (问题描述) 约瑟夫问题的一种描述是:编号为1,2,......n,的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任意选 一个正整数作为报数的上限值m,从第一个人开始 ...

  10. [转载] ETL和Kettle

    http://tech.ccidnet.com/art/1105/20080407/1411567_1.html http://blog.csdn.net/cissyring/article/deta ...