EF框架之——Code First以及踩过的这些“坑”
传送门
以前在上海做了一段时间的Asp.net,基本用的都是.net自带的EF框架连接数据库,不过都是用的Model First,最近开了个项目,我就先把数据层,搭建了下,用的Code First,用起来要比Model First繁琐一点。今天来一起走一遍这个让我踩了几个雷的Code First.
1.建立类库项目,用来存放我们定义的映射数据表的实体类。
2.EF框架已经添加到Nuget管理器中,可以在Nuget管理器命令行中输入"install-package entityframework"添加EF框架的依赖。默认项目一定要选对
由于我已经安装过,所以就提示依赖已存在

3.在对应的项目的配置文件中(如类库的默认配置文件就是"App.config")添加数据库连接字符串节点。

4.新建一个项目的数据上下文类(大概就是类似于内存中的数据库上下文),继承DbContext类,将初始化字符串传到父类的构造,后期迁移也是通过此字符串传入到父类中,进行数据库连接的实例化。重写父类的方法:

5.开始建立实体类,建立实体基类BaseEntity,建立一些通用的属性,比如Id,CreateTime等
public class BaseEntity
{
public virtual Guid Id { get; set; } = new Guid();//id
public virtual DateTime CreateTime { get; set; } = DateTime.Now;//数据创建时间
public virtual bool IsRemove { get; set; }
}
继续建立自己所需的派生类,需要自己做好非空注解,外键注解等数据约束。
namespace StudentSys.Models
{
public class Student:BaseEntity
{
[Required]//非空约束
public string Name { get; set; }
public string Sex { get; set; }
public DateTime BornDate { get; set; }
public string QQ { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public string ImagePath { get; set; }
[ForeignKey(nameof(Class))]//外键约束
public Guid? ClassId { get; set; }
public Class Class{ get; set; }
}
}
6.建立好这些实体类之后,就要去数据上下文类中进行注册,表示这些类都对应一个数据库中一张表,用DbSet集合作为属性类型,映射后当作内存中存放数据表中的数据。

7.做好这些准备工作之后,也就代表你的代码段的模型已经建立完成了,需要向数据库端进行迁移,打开Nuget管理器控制台按照以下流程输入命令。
(1)控制台输入 PM> Enable-Migrations 如果出现黄色的提示,则跳转下一步,报错,请到文章末尾查看报错类型和解决方案。成功项目中会多一个Migrations目录
(2)继续输入“add-migration createdb”,注意createdb可由咱们自行定义。此时Migrations目录中生成了一个名字很长的cs文件,可以看到其为咱们创建数据表的代码,ef对枚举、复杂类型、实体继承都提供了非常棒的知识,我们此时可以修改相应代码以生成我们希望看到的表结构。类名就是我们刚刚输入的名字。此时还没有和数据库端有任何关系,可以把这个类当作数据库的建库脚本,我们最后一步其实就是将这个类转化为sql语句然后在Sql Server中运行。

(3)最后一步输"update-database",就是对远程数据端进行更改了。不报错则操作成功。

8.打开数据库,就能看到生成的数据库和数据表已经存在了。

问题和解决办法
(1)提示”EntityType 'XXX' has no key defined“。
解决办法:这是因为这里需要你所有的实体类都要指定主键,所以你的每个类要么有一个Id的属性要么有一个属性上面有[key]特性的标识。我这里是把Id定义在基类中。
(2)提示”System.Data.SqlClient.SqlException (0x80131904): 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)“
解决办法:
(1)查看服务中的对应数据库实例是否开启

(2)网络配置中把TCP/IP选项打开,然后选中TCP/IP,右击属性,将所有的地址都启用
(3) 查看Sql Server数据库属性中,允许远程是否已经被打开。尝试在服务配置管理中,将服务登陆账号修改为"内置账号",选择"Local System"。
(4)以上还不行的话,卸载本地数据库

(5)以上还不行的话,终极办法!!!在确保连接字符串正确的前提下,将连接字符串复制到DbContext的构造方法中。因为我观察到如果传入配置文件中连接字符串节点的key到这个构造的话,之后报错的连接字符串要比我的这个多了一个单词。如下就能成功解决上面的问题,至于原因还未知,希望大佬知道的话可以解惑,万分感谢。

EF框架之——Code First以及踩过的这些“坑”的更多相关文章
- EF框架的code first
需要添加EntityFramework的引用,在NuGet(在工具--库程序包管理--程序包管理控制台) 控制台输入Install-Package EntityFramework,目前版本是6.1.3 ...
- MVC实战之排球计分(六)—— 使用EF框架,创建Controller,生成数据库。
在上篇博客我们写到,此软件的数据库连接我们使用的是EF框架,code first模式下, 通过模型类,在创建controller的时候直接生成数据库,完成数据库的连接,与操作. 在使用EF框架之前,我 ...
- EF框架step by step(7)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(7)—Code First DataAnnotations(1)
Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...
- EF框架step by step(8)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架CodeFirst the model backing the 'PModelEntities' context has changed since the database was created. Consider using Code First Migrations to update the database
1.采用code first 做项目时,数据库已经生成,后期修改数据库表结构.再次运行时出现一下问题: Entity Framework : The model backing the 'Produc ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- EF框架的三种工作方式
EF框架step by step(1)—Database-First EF框架step by step(2)—Model-First EF框架step by step(3)—Code-First 通过 ...
随机推荐
- [2019杭电多校第二场][hdu6598]Harmonious Army(最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6598 题意是说一个军队有n人,你可以给他们每个人安排战士或者法师的职业,有m对人有组合技,组合技的信息 ...
- Excel VBA 判断工作表是否为空或被使用过(比如设置过框线)
IsEmpty 函数 返回 Boolean 值,指出变量是否已经初始化. [语法] IsEmpty(expression) 必要的 expression 参数是一个 Variant,包含一个数值或字符 ...
- 51nod - 1586 - 约数和 - 打表 - 思维
https://www.51nod.com/Challenge/Problem.html#problemId=1586 一眼看过去居然一点思路都没有的,一言不合就打表,打贡献表. #include & ...
- Nodejs中request出现ESOCKETTIMEDOUT解决方案
做需求的时候,使用Nodejs的request批量请求某一个接口,由于接口超时,出现 ESOCKETTIMEDOUT,程序中断 为了让程序遇到 ESOCKETTIMEDOUT 之后能够继续执行下去,需 ...
- mysql安装,卸载; 库和表的基础操作
数据库 """ 1.什么是数据库:管理数据的系统 - 安装某种管理数据的系统 - 管理的对象本质是文件 2.存储数据的位置:内存.硬盘 3.什么是系统:运行在硬件基础上 ...
- Robot Framework 源码阅读 day2 TestSuitBuilder
接上一篇 day1 run.py 发现build test suit还挺复杂的, 先从官网API找到了一些资料,可以看出这是robotframework进行组织 测试案例实现的重要步骤, 将传入的te ...
- C#/.NET VS2017+ EF+SQLite.CodeFirst——真正实现CodeFirst
本文所介绍的是真正的EF+CodeFirst,不需要提前建表,由代码自动生成! 进行前需要准备的: 1.下载Sqlite Experthttp://www.sqliteexpert.com/downl ...
- Linux架构之NFS共享存储1
第35章 NFS共享存储 35.1 NFS基本概述 NFS是Network File System的缩写及网络文件系统.NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录. 常见的文件 ...
- python常用函数 Z
zip(iterable, iterable..) 数据打包和解包,一般结果是一个元组(最短匹配). 例子:
- RabbitMQ走过的坑,发送的消息是乱码
发送的消息在可视化界面中是乱码,如图: 看见这个content_tpye没有,是不是很奇怪,就是这个坑,设置下就行,看代码: @Bean Jackson2JsonMessageConverter me ...