ASP.NET CORE 使用 EF CORE访问数据库
asp.net core通过ef core来访问数据库,这里用的是代码优先,通过迁移来同步数据库与模型。
环境:vs2017,win10,asp.net core 2.1
一、从建立asp.net core web项目开始
1、通过vs2017建立一个asp.net core web应用程序

2、在models文件夹下面创建一个student类,这个类用作数据模型,表示的是数据库里面的student表
public class Student
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid ID { set; get; }
[Required]
[MaxLength()]
public string Name { set; get; }
public int Age { set; get; }
public byte Sex { set; get; }
public string Remark { set; get; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreateDate { set; get; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime LastUpdate { set; get; }
}
关于表里面的特性说明这里暂时不管,等创建了数据库后再来说明。
3、创建数据库上下文
在项目中建立一个Data文件夹,创建一个类SqlServerContext
public class SqlServerContext : DbContext
{
public SqlServerContext(DbContextOptions<SqlServerContext> options)
: base(options)
{
}
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().ToTable("Student");
}
}
在 Entity Framework 中,实体集通常与数据表相对应,具体实体与表中的行相对应。当数据库创建完成后, EF 创建一系列数据表,表名默认和 DbSet 属性名相同。但可以在OnModelCreating方法中指定表名。
4、注册数据库上下文
打开 Startup.cs,在ConfigureServices方法中添加如下代码
services.AddDbContext<SqlServerContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SqlServerContext")));
SqlServerContext是数据库字符串的名称。打开appsettings.json 文件,并如以下示例所示添加连接字符串。
"ConnectionStrings": {
"SqlServerContext": "Server=(localdb)\\ProjectsV84;Database=TestDB1;Trusted_Connection=True;MultipleActiveResultSets=true"
}
这里连接的是本地数据库,数据库的验证方式是windows验证。
5、迁移
通过命令行接口 (CLI)执行迁移命令来实现迁移,在此之前,需要按照适用于命令行接口 (CLI) 的 EF 工具。 注意: 必须通过编辑 .csproj 文件来安装此包;不能使用 install-package 命令或包管理器 GUI。
若要编辑 .csproj 文件,可右键单击解决方案资源管理器中的项目名称,然后选择“编辑EFCoreDB.csproj”,在ItemGroup里面添加如下代码
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
在项目所在的文件夹下打开cmd窗口,执行命令:dotnet ef migrations add CreateDB

命令执行成功的话,会在项目中添加一个文件夹Migrations

这里面的两个文件就是EF如何创建数据库的,一般来说不需要手动去修改这两个文件。
这时候,数据库里面还没有相应的数据库和表
在cmd中执行命令dotnet ef database update,成功执行后,就可以在数据库里面看到创建的数据库和表了

6、分析
现在来看看student表的列和模型student的关系

系统默认ID是主键,这是一种约定,当然也可以在模型student的ID属性上用 [Key]来修饰,这时候ID可以是其他的名称。具体有关模型创建的信息,请参考创建并配置模型
模型中,ID的类型是guid,在数据库里面就对应类型uniqueidentifier,[DatabaseGenerated(DatabaseGeneratedOption.None)]特性表示ID列不需要数据库自动添加值。
Name和Remark都是string类型,remark没有任何修饰,所以数据库中的类型就是nvarchar(max),且可以为空。
7、步骤优化
上面的的6个步骤中,第3,4两步可以不用手动添加。可以通过新搭建基架的项目命令来完成。
先完成上面的1,2两个步骤,然后在Controllers文件夹上右键==》添加==》新搭建基架的项目


在模型类中选择第二步添加的模型student,数据上下文类中,点击后面的+号,将名称改为sqlserver,其他的默认就行,最后点击添加。系统会自动的创建数据上下文,并且还帮你注册了,除此之外,还添加了students控制器和相应的视图,对于控制器和视图可以保留,也可以删掉。剩下的需要修改一下配置文件中数据库的连接字符串,然后接着第五步继续就可以了。
二、当模型修改或者添加新的模型后
1、修改模型student,添加一个学号字段code;添加模型course,每个学生可以报多个课程,每个课程可以有多个学生报名,因此student和course是多对多的关系,需要一个中间表来关联,所以添加模型Enrollment。修改后的模型如下:
public class Student
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid ID { set; get; }
[Required]
[MaxLength()]
public string Name { set; get; }
[Required]
[MaxLength()]
public string Code { set; get; }
public int Age { set; get; }
public byte Sex { set; get; }
public string Remark { set; get; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreateDate { set; get; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime LastUpdate { set; get; }
public ICollection<Enrollment> Enrollments { get; set; }
} public class Enrollment
{
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public Guid StudentID { get; set; }
public Grade? Grade { get; set; } public Course Course { get; set; }
public Student Student { get; set; } }
public enum Grade
{
A, B, C, D, F
} public class Course
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; } public ICollection<Enrollment> Enrollments { get; set; } }
修改数据上下文
public class SqlServerContext : DbContext
{
public SqlServerContext(DbContextOptions<SqlServerContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().ToTable("Student");
modelBuilder.Entity<Course>().ToTable("Course");
modelBuilder.Entity<Enrollment>().ToTable("Enrollment"); }
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; } }
2、迁移

执行这个命令后,在Migrations文件夹中添加了20190329030918_AddTable.cs文件,里面的内容就是关于模型的修改的一些代码
继续执行命令dotnet ef database update
完事后,数据库中表已经正常添加了



通过上面的方式,在student表中添加了列code,新建的表Enrollment中有主键和外键。当然也可以不用设置外键,直接将表Enrollment的CourseID和StudentID设置为复合主键。这样的话,模型student中就不需要导航属性StudentID(Course,Enrollment中也是如此)。同时数据上下文中需要指定Enrollment表的复合主键:
modelBuilder.Entity<Enrollment>().ToTable("Enrollment").HasKey(c=>new { c.StudentID,c.CourseID});
这样一来,Enrollment中的EnrollmentID也要去掉。设置复合主键只能是在数据上下文中设置。
三、为数据库添加初始数据
在数据库中,有些表是有初始数据的,可以通过sql语句导入,在这里通过程序来实现吧
打开Program.cs文件,修改后:
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<SqlServerContext>();
Initialize(context);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred while seeding the database.");
}
} host.Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>(); private static void Initialize(SqlServerContext context)
{
if (!context.Courses.Any())
{
var courses = new Course[]
{
new Course{CourseID=,Title="数学",Credits=},
new Course{CourseID=,Title="语文",Credits=},
new Course{CourseID=,Title="英语",Credits=},
new Course{CourseID=,Title="化学",Credits=},
new Course{CourseID=,Title="生物",Credits=},
new Course{CourseID=,Title="物理",Credits=},
new Course{CourseID=,Title="体育",Credits=}
};
foreach (Course c in courses)
{
context.Courses.Add(c);
}
context.SaveChanges();
} } }
运行程序,数据就会添加到数据库了。
四、数据库表里面有数据的情况下修改表结构
这里的修改肯定是合理的修改,不能说你将字符串的列改成了数字的列。这里试验一下添加新的列,不能为空的
1、在course模型中,添加一个非空的字段

2、迁移
执行完迁移的第一个命令后,打开系统添加的文件,找到Up方法

可以看到up方法里面只有影响修改的部分,要设置一个非空列的初始值,就需要在这里改代码了,改好了之后执行迁移的第二个命令。查询数据库,表结构已经更改,而且里面的数据也没有丢失。
关于EF CORE的应用的基本介绍就到这里,更深入的学习还是参考微软官方文档吧
ASP.NET CORE 使用 EF CORE访问数据库的更多相关文章
- asp.net core + mysql + ef core + linux
asp.net core + mysql + ef core + linux 以前开发网站是针对windows平台,在iis上部署.由于这次需求的目标服务器是linux系统,就尝试用跨平台的.NET ...
- 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1
[ASP.NET Core]EF Core - “影子属性” 有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...
- net Core 通过 Ef Core 访问、管理Mysql
net Core 通过 Ef Core 访问.管理Mysql 本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1. ...
- 一个官翻教程集合:ASP.NET Core 和 EF Core 系列教程
通过一个大学课程案例讲解了复杂实体的创建过程及讲解 1.ASP.NET Core 和 Entity Framework Core 系列教程——入门 (1 / 10) 2.ASP.NET Core 和 ...
- .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程
本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...
- Entity Framework Core(EF Core) 最简单的入门示例
目录 概述 基于 .NET Core 的 EF Core 入门 创建新项目 更改当前目录 安装 Entity Framework Core 创建模型 创建数据库 使用模型 基于 ASP.NET Cor ...
- [.NET Core] - 使用 EF Core 的 Scaffold-DbContext 脚手架命令创建 DbContext
Scaffold-DbContext 命令 参数 Scaffold-DbContext [-Connection] <String> [-Provider] <String> ...
- .net core webapi+EF Core
.net core webapi+EF Core 一.描述: EF Core必须下载.net core2.0版本 Micorsoft.EntityFrameworkCore:EF框架的核心包Micor ...
- 【ASP.NET Core】EF Core 模型与数据库的创建
大家好,欢迎收看由土星卫视直播的大型综艺节目——老周吹逼逼. 今天咱们吹一下 EF Core 有关的话题.先说说模型和数据库是怎么建起来的,说装逼一点,就是我们常说的 “code first”.就是你 ...
随机推荐
- vi和vim上查找字符串
方法/步骤 1 我们以samba的配置文件为例,搜索一个user的字符串. vim /etc/samba/smb.conf 打开smb.conf 2 命令模式下,输入/user "/&quo ...
- glTF格式初步了解
glTF格式初步了解 近期看到Qt 3D的进展.偶然了解到了一种新的格式:glTF格式.这样的格式据说比现有的3D格式更加符合OpenGL应用的须要.这引起了我的好奇.于是我在Qt 3D的外部链接中找 ...
- ubuntu下安装pycharm的方法
linux下安装pycharm是比较麻烦的. 安装pycharm之前要安装好JDK8,依次执行如下的命令: sudo add-apt-repository ppa:webupd8team/java s ...
- 如何将Python的py程序打包成跨平台的exe文件
在编写了自己的第一个可以爬写网页源代码的程序之后,发现如果在没有安装了pythonLDLE程序的计算机上根本就跑不出来.所以开始寻找可以将程序打包成跨平台运行的exe文件. 经过自己费力的谷歌没有一个 ...
- 手把手教你_怎么找android应用的包名和启动activity
自己主动化測试中常常遇到这个问题,关于这个题目,方法众多,咱的目的是找个比較简单靠谱的: 方法一: 先进入cmd窗体,adb shell 后: cd /data/data ls 能够看到包名了吧,缺点 ...
- STL vector的介绍(1)
尝试下翻译STL里面的一些easy和算法.四级过了.六级刚考.顺便练练自己的英语水平.翻译的不好的地方请大神多多不吝赐教哈.方便我改正. 原来均来自:http://www.cplusplus.com/ ...
- Cocos2d-X-3.0 之后的版本的环境搭建
Cocos2d-X-3.0 之后的版本的环境搭建 由于cocos2d游戏开发引擎更新十分频繁,官方文档同步不够及时和完善.所以不要照着官方文档来照做生成工程. <点击图片就能进入网站> ...
- Redis和Memcache性能测试对比
Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache全面胜出,当然Redis也有自己的优点:比如数据持久化.支持更多的数据结构(Set List ZS ...
- oracle多表关联多字段update
多表关联多字段update 有代码有J8: update spatial_references set( auth_name, auth_srid, falsex, falsey, xyunits, ...
- C项目实践--学生成绩管理系统
1.功能需求分析 学生成绩管理系统是对学生基本信息及成绩的管理.本程序主要实现了对学生的学号.姓名等基本信息以及各项学科成绩进行增加.删除.修改.查询和保存到磁盘文件等操作.主要功能描述如下: (1) ...