下面通过实例来学习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. CODEVS上一道很有趣的题(2145 判断奇偶性)

    判断函数y=x^n次方的奇偶性若是奇函数就输出ji,偶函数输出ou 233333 用到了long long 还是爆了,于是就上了char a[1000000] =.= #include<stdi ...

  2. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana

    https://vjudge.net/contest/68966#problem/C [参考]http://blog.csdn.net/qinmusiyan/article/details/79862 ...

  3. 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次幂。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu

    这是PAT中的一道练习题 刚开始的时候我想着直接定义正整数n,结果走了很大的弯路,因为题目中要求n小于10的100次幂,即最大的正整数n有100位,而C语言中整型数字最大占8个字节的存储空间,如果按无 ...

  4. 原创-angularjs2不同组件间的通信

    AngualrJs2官方方法是以@Input,@Output来实现组件间的相互传值,而且组件之间必须父子关系,下面给大家提供一个简单的方法,实现组件间的传值,不仅仅是父子组件,跨模块的组件也可以实现传 ...

  5. Yeelink初步体验

    环境 Qemu: 2.8.0 开发板:vexpress-ca9   概述     前面的博文已经使我们的虚拟开发板具备了访问外网的目的,离物联网越来越近了.要玩物联网,Yeelink不得不说,它提供了 ...

  6. js原型链部分详细使用说明案例

    1. 'index.html'文件 ```html <!DOCTYPE html> <html lang="en"> <head> <me ...

  7. Python的RSA加密和PBE加密

    最近在写接口的时候,遇到了需要使用RSA加密和PBE加密的情况,对方公司提供的DEMO都是JAVA的,我需要用python来实现. 在网上搜了一下,python的RSA加密这块写的还是比较多的,但是P ...

  8. Maven学习-优化和重构POM

    在一个复杂的项目中,项目的各个模块存在各种相互依赖关系.优化一个多模块项目的POM最好通过几步来做.总的来说,我们总是寻找一个POM中的重复或者多个兄弟POM中的重复.在多模块项目中依赖重复的模式主要 ...

  9. Java7中的ForkJoin并发框架初探(下)—— ForkJoin的应用

    前两篇文章已经对Fork Join的设计和JDK中源码的简要分析.这篇文章,我们来简单地看看我们在开发中怎么对JDK提供的工具类进行应用,以提高我们的需求处理效率. Fork Join这东西确实用好了 ...

  10. StringTokenizer使用笔记

    StringTokenizer 基本使用 笔者最近在做算数表达式的逆波兰式转换和解析,原始表达式为String类型,在使用StringTokenizer 之前笔者的解决思路是 将原始表达式->转 ...