下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库。

本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以无缝切换到其他数据库。

目前 EF Core 支持的数据库:

  • Microsoft SQL Server
  • SQLite
  • Postgres (Npgsql)
  • SQL Server Compact Edition
  • InMemory (for testing purposes)
  • MySQL
  • IBM DB2

1.新建项目

新建项目,选择.NET Core,然后选择ASP.NET Core Web Application (.NET Core),将其命名为EFCoreDemo,如下图所示。

单击“确定”按钮以后,出现选择模板对话框;选择Web应用程序模板,并将“身份验证”设置为“不进行身份验证”,如下图所示。

2.引用Entity Framework Core

在NuGet命令行下安装引用:

Install-Package Microsoft.EntityFrameworkCore.Sqlite

也可以使用NuGet包在管理器中搜索Microsoft.EntityFrameworkCore.Sqlite来安装。

3.创建实体

在项目中添加一个Models文件夹,然后在Models文件夹通过右键快捷菜单新建一个类User.cs:

    public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}

继续新建一个类DataContext.cs:

    public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options)
: base(options)
{
}
public DbSet<User> Users { get; set; }
}

4.创建数据库

打开Startup.cs,在ConfigureServices方法中添加如下代码:

        public void ConfigureServices(IServiceCollection services)
{
var connection = "Filename=./efcoredemo.db";
services.AddDbContext<DataContext>(options => options.UseSqlite(connection));
// Add framework services.
services.AddMvc();

需要 using Microsoft.EntityFrameworkCore;

添加好以后,接着来安装引用Microsoft.EntityFrameworkCore.Tools。使用NuGet命令行:

Install-Package Microsoft.EntityFrameworkCore.Tools

下面开始创建数据库,这里在程序包管理控制台执行命令进行迁移及更新。

打开VS 2017菜单 工具→NuGet包管理器→程序包管理控制台。

首先输入Add-Migration MyFirstMigration执行,接着输入Update-Database执行。出现Done.表示成功创建数据库。

如果需要使用dotnet ef 命令,首先打开EFCoreDemo.csproj 文件编辑,在Project节点中添加如下

  <ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
</ItemGroup>

如果是在VS中编辑则会自动还原,外面编辑需要手动dotnet restore。

还原好以后就可以使用dotnet ef 命令。

在命令提示符中首先输入dotnet ef migrations add MyFirstMigration,然后再输入dotnet ef database update。

出现成功的提示,这样我们就创建好了数据库,如下图所示。更多EF命令介绍请输入dotnet ef -h。

5.项目使用

在Controllers文件夹上右击,在弹出的右键快捷菜单中单击“添加”→“新建项”,新建一个MVC控制器类UserController:

UserController.cs

  public class UserController : Controller
{
private DataContext _context; public UserController(DataContext context)
{
_context = context;
}
// GET: /<controller>/
public IActionResult Index()
{
return View(_context.Users.ToList());
} public IActionResult Register()
{
return View();
} [HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Register(User registeruser)
{
if (ModelState.IsValid)
{
_context.Users.Add(registeruser);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(registeruser);
}
}

你会注意到控制器需要DataContext作为构造函数的参数。ASP.NET Core依赖注入将通过构造函数注入DataContext到控制器。

Index action显示所有用户,Register action注册用户是将用户添加至用户表。

然后在Views文件夹中添加一个User文件夹,然后添加一个Index视图:

Index.cshtml

@model IEnumerable<EFCoreDemo.Models.User>

@{
ViewBag.Title = "用户";
}
<table class="table">
<tr>
<th>Id</th>
<th>用户名</th>
</tr> @foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
</tr>
}
</table>

接下来再添加一个 Register视图。

@model EFCoreDemo.Models.User
@{
ViewBag.Title = "用户添加";
}
<form asp-controller="User" asp-action="Register" method="post">
<div class="form-group">
<label asp-for="UserName" class="col-md-2 control-label">用户名:</label>
<div class="col-md-10">
<input class="form-control" asp-for="UserName" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
<label asp-for="Password" class="col-md-2 control-label">密码:</label>
<div class="col-md-10">
<input class="form-control" asp-for="Password" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="保存" class="btn btn-default" />
</div>
</div>
</form>

在调试那里选择EFCoreDemo启动,最后程序运行起来,在地址栏输入http://localhost:5000/User/Register访问注册。

在注册那里填入用户信息。注册成功后将跳转至http://localhost:5000/User,如下图所示。

本文是对《ASP.NET Core跨平台开发从入门到实战》 6.2 Code First 的更新,亦是对之前的博文ASP.NET Core 开发 - Entity Framework (EF) Core的更新。

如果你觉得本文对你有帮助,请点击“推荐”,谢谢。

EF Core学习Code First的更多相关文章

  1. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  2. 基于EF Core的Code First模式的DotNetCore快速开发框架

    前言 最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单.所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code f ...

  3. 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持

    前言 距离上一篇文章<基于EF Core的Code First模式的DotNetCore快速开发框架>已过去大半个年头,时光荏苒,岁月如梭...比较尴尬的是,在这大半个年头里,除了日常带娃 ...

  4. EF Core 的 Code First 模式

    0 前言 本文正文第一节,会对 Code First 进行基本的介绍,以及对相关名词进行说明,读者一开始可以不用在这里消耗过多时间,可以先操作一遍例子,再回过头理解. 第二节,以一个简单的例子,展示 ...

  5. EF Core的Code First 基础

    一.创建实体类与映射类 通过NuGet引用Microsoft.EntityFrameworkCore 1.创建实体类 Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例 ...

  6. EF core 学习 执行原生sql语句 之ExecuteReader 和ExecuteScalar

    通过ef core 源码分析 Microsoft.EntityFrameworkCore.Storage.RelationalCommandExtensions类中有相应的方法 为此得到相应的结果: ...

  7. Entity Framework (EF) Core学习笔记 1

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

  8. NET Core 使用EF Core的Code First迁移和DBFirst

    DBFirst (1)Microsoft.EntityFrameworkCore (2)Microsoft.EntityFrameworkCore.Design (3)Microsoft.Entity ...

  9. EF core 学习笔记

    应该 以领域 为核心开发程序, 不应该 以数据库 entityframeworkcore entityframeworkcore.sqlserver entityframeworkcore.tool ...

随机推荐

  1. iOS开发 - Swift实现检测网络连接状态及网络类型

    一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...

  2. PHP预定义变量$_SERVER

    PHP预定义变量$_SERVER $_SERVER 是一个包含诸如头部(headers).路径(paths)和脚本位置(script locations)的数组.数组的实体由 web 服务器创建,不能 ...

  3. Spring框架基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-spring-framework/ Spring框架简介 Spring , 一个开源的框架 , ...

  4. 当谈 SQL 优化时谈些什么?

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:孙银行 背景 Mysql数据库作为数据持久化的存储系统,在实际业务中应用广泛.在应用也经常会因为SQL遇 ...

  5. 数据转换d2d.js

    d2d.js what? d2d是data2data的简写,用来转换为符合需求的data. why? 我们在开发中定义好了的接口字段,后端工程可能因某些原因修改了字段, 或者我们用的插件或组件用到的数 ...

  6. session与cookie-----2017-05-08

    会话控制:目的是记录不同用户身份. 1.session:有实效性 特点: (1)存在在服务器 (2)每个用户都会存一份 (3)可以存储任意类型的数据 优点:安全性高 缺点:服务器压力过大 2.cook ...

  7. chkconfig命令(管理开机自启)

    提供了一个简单的命令行工具来维护/etc/rc[0-6].d目录层次结构通过减轻系统管理员的直接操作任务,在这些目录中的许多符号链接.仅是简单的改变了符号链接,而非立即启动或禁止一个服务. 语法: c ...

  8. Servlet简单总结(一)

    一.Servlet简单总结 1.1. 什么是Servlet Servlet是JavaEE三大组建之一,是使用Java语言编写服务器端的程序,主要用来处理Web应用程序中的请求-响应.Servlet并没 ...

  9. [刷题]算法竞赛入门经典(第2版) 5-8/UVa230 - Borrowers

    //又开学啦,不知不觉成为大二的老人了...时间过得好快啊,感觉好颓废... 题意:建立一个借书/归还系统.有借.还.把还的书插到书架上这三个指令. 代码:(Accepted, 0ms) //UVa2 ...

  10. [笔记]scanf的使用(主要是针对char)

    学的是C++,用cin cout也用的很顺溜,写自己的类时重载"<<"与">>"运算符也很爽,但是发现在刷算法竞赛题时,cin cout ...