使用.Net Core+EF7 完成CodeFirst
emmm,本来想着用Core做一个小项目玩玩的,然后肯定是要用到数据库的,
然后想,啊,要不用CodeFirst,感觉很腻害的样子,于是,一脸天真无邪的我就踏入了一个深不见底的天坑。。。
本来想着,应该不是很难,多百度就好,辣么多大神都写了教程,
零零散散的花了将近三个星期时间,照着Demo写了N多次的我,不得不放弃了挣扎,
邀请了一位一起工作的大佬,看着他噼里啪啦调试了半个小时之后,就出现的数据库,莫名心塞,
大佬就是大佬,原谅小弟我才疏学浅,所以做一个笔记先,留着备用。。
我会边写博客,边做一个最简单的Demo,其实很多时候我们缺的,就是这些入门级的东西,
那些加了各种验证和功能的代码,反而会影响我们找到需要的代码。
工具:VS2017
环境:.Net Core 2.0 ,EF7
首先,我们需要的是建一个解决方案,一个类库项目,以及一个Web项目
这些建好之后的项目结构,应该是酱紫的
建好之后,就到了一个小关键了,我们要添加EF的依赖了,怎么添加呢?
网上看了好多方法,基本是都是使用工具=>NuGet包管理=>程序包管理控制台,来添加依赖,大概是酱紫:
可以先开着,待会儿用得着,不过我觉着这样有点麻烦,所以直接写在项目的工程文件(*.csproj)里面去了,要写的代码如下
- <ItemGroup>
- <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.1" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" />
- </ItemGroup>
保存之后,Models的EF依赖就已经加入了,怎么知道是否成功呢?看这里,,,
以前是只有一个SDK的,现在多了个NuGet,里面还有俩东西,而且没有警告啊那些乱七八糟的东西,就表示没问题了,,
同样的,我们为WebFront项目,也加上依赖,,这里就不截图了,,,
走到这一步,我们就应该开始创建数据库的上下文和数据表了
创建数据库的上下文类(DBCodeFirst)和数据表类(DT_User),结构如下
DBCodeFirst的内容如下:
- public class DBCoreFirst : DbContext
- {
- public DBCoreFirst() : base()
- {
- }
- public DBCoreFirst(DbContextOptions<DBCoreFirst> options)
- : base(options)
- {
- }
- override protected void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- {
- base.OnConfiguring(optionsBuilder);
- }
- #region 数据表
- public DbSet<DT_User> DT_User { get; set; }
- #endregion
- }
DT_User的内容如下:
- public class DT_User
- {
- /// <summary>
- /// 默认int类型ID为主键
- /// 必须有一个字段为主键,不然会报错
- /// </summary>
- public int ID { get; set; }
- public string UserName { get; set; }
- }
然后在WebFornt项目的Startup类的ConfigureServices方法中写一段代码,连接字符串中的DataBase写的数据库名称是啥,生成的数据库名称就是啥,可以和你的上下文类名称不一致
这时候,我们再来看看数据库的情况,是没有DBCodeFirst这个库的
重头戏到了,还记得开始打开的程序包管理控制台么?
打开它,输入命令,Add-Migration *****(这块儿随意)
- Add-Migration DBCoreFirst
在执行它的时候,我报了好几个错,一一列举出来
第一个报错
- GenericArguments[], '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[], 'Models.Migrations.DBCoreFirst',
- on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'.
- genericarguments [ ],”模型。迁移。dbcorefirst ','微软。entityframeworkcore。
- 设计。idesigntimedbcontextfactory ` [ tcontext ]“违背类型的tcontext约束。
打开一个由命令生成的文件看看
两个类的名称一毛一样,数据库又是根据DBCodeFirst这个类来生成的,不出问题就见鬼了,,
那么,左边的类名为什么会和右边的一样??
问题在于我们执行的“Add-Migration DBCoedFirst“命令
- Add-Migration DBCodeFirst
- 改为
- Add-Migration DBLog
执行之后的效果,很明显的变了
紧接着,执行命令“Update-DataBase”
然后,我们去数据库看看
很稳,数据库生成了,EF会自动生成__EFMigrationsHistory表,好像是用来记录数据迁移日志的,咱们现在忽略就好
至此,EF7的CodeFirst生成数据库就完成了,,
自我感觉,写完这一篇,我打马赛克的技术也越来越稳了,,,
使用.Net Core+EF7 完成CodeFirst的更多相关文章
- 使用.Net Core+EF7 CodeFirst(2)
上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...
- ASP.NET Core 3.0 WebApi 系列【2】.Net Core 3.0+ CodeFirst + MySql 实现数据的迁移
写在前面 在前一小节中,我们创建了基于RESFULL风格的服务.这个小节,尝试使用CodeFirst+MySql 的方式实现数据迁移. 一.开发环境 [1]运行环境:win10 家庭版 [2]开发工具 ...
- 【原创】EntityFramework Core 中使用 CodeFirst 模式时 PowerShell 版本问题及解决
一.描述: 在使用 Entity Framework Core 时,使用 CodeFirst 模式, 在 VS 中的 PMC(nuget 包管理 控制台) 控制台界面使用如下命令: Install-P ...
- 第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例)
一. EF简介 1. 定义 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台的数据访问技术,它还是一种对象关系映射器(ORM),它使.NET 开发人员能够使用面向对 ...
- MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例
dotnet core 2.0 发布已经好几天了,期间也把原来 dotnet core 1.1 的 MVC 项目升级到了 2.0,升级过程还是比较顺利的,变动也不是太多.升级的过程中也少不了 Enti ...
- .Net Core建站(1):EF Core+CodeFirst数据库生成
emmm,本来想着用Core做一个小项目玩玩的,然后肯定是要用到数据库的, 然后想,啊,要不用CodeFirst,感觉很腻害的样子,于是,一脸天真无邪的我就踏入了一个深不见底的天坑... 本来想着,应 ...
- .Net Core建站(2):EF Core+CodeFirst数据库迁移
上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...
- Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- EntityFramework Core使用PostgreSQL
EntityFramework Core使用PostgreSQL 0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用 ...
随机推荐
- 使用gitbook
前面的话 gitbook功能强大,可以自动实现搜索及翻页等功能,上手容易,用markdown书写即可,且可以自动生成响应式网站.本文将详细介绍如何使用gitbook 安装 1.使用npm全局安装git ...
- 脑残手贱:被NFS祸害的调度系统
建议:任何时候,都要三思而后行!!! 事请的缘由 系统中采用slurm调度系统来进行并行计算.但是在GPU节点上,无论如何都无法启动slurmd,报插件初始化错误的故障. 因此需要编译新的munge和 ...
- PAT-甲级-1003
一.看题,https://www.patest.cn/contests/pat-a-practise/1007 其实,也是一顿暴力,但是最后一个测试点会运行超时,最开始,计算一段区间的值的总和的时候, ...
- yum常用选项和参数
列举包文件 # yum list #列出资源库中所有可以安装或更新的rpm包 # yum list updates #列出资源库中所有可以更新的rpm包 # yum list installed #列 ...
- 蓝桥杯之K好数
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.3 ...
- 【收藏】Web前端开发第三方插件大全
收集整理了一些Web前端开发比较成熟的第三方插件,分享给大家. ******************************************************************** ...
- 在.csproj文件中增加npm, bower, gulp, webpack的构建
<Target Name="RunNpm" AfterTargets="AfterBuild"> <!-- As part of publ ...
- Sqlserver将数据从一个表插入到另一个表
.如果是整个表复制表达如下: insert into table1 select * from table2 .如果是有选择性的复制数据表达如下: insert into table1(column1 ...
- 约瑟夫环C#解决方法
/*约瑟夫环 (问题描述) 约瑟夫问题的一种描述是:编号为1,2,......n,的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任意选 一个正整数作为报数的上限值m,从第一个人开始 ...
- [转载] ETL和Kettle
http://tech.ccidnet.com/art/1105/20080407/1411567_1.html http://blog.csdn.net/cissyring/article/deta ...