创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建数据模型类(POCO类)
在Models文件夹下添加一个User类:
namespace MyFirstApp.Models
{
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Bio { get; set; }
}
}
除了你期望的用来构建Movie模型的属性外,将作为数据库主键的ID
字段是必须的。
安装Entity Framework Core MySQL相关依赖项
注:其中"MySql.Data.EntityFrameworkCore": "7.0.6-ir31",
要7.0.6以上版本。
Missing implementation for running EntityFramework Core code first migration。
创建Entity Framework Context数据库上下文
在Models文件夹下添加一个UserContext类:
/// <summary>
/// The entity framework context with a User DbSet
/// > dotnet ef migrations add MyMigration
/// </summary>
public class UserContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
var configuration = builder.Build();
string connectionString = configuration.GetConnectionString("MyConnection");
optionsBuilder.UseMySQL(connectionString);
}
protected override void OnModelCreating(ModelBuilder builder)
{
// Sets the properties that make up the primary key for this entity type.
builder.Entity<User>().HasKey(m => m.ID);
base.OnModelCreating(builder);
}
}
DbContext
类负责连接数据库并将User对象映射到数据库记录。数据库上下文(Database Context)可以在Startup文件中的ConfigureServices
方法中用依赖注入容器进行注册的:
public void ConfigureServices(IServiceCollection services)
{
string connectionString = Configuration.GetConnectionString("MyConnection");
services.AddDbContext<UserContext>(options =>
options.UseMySQL(connectionString)
);
// Add framework services.
services.AddMvc();
}
注:UseMySQL
是MySQL.Data.EntityFrameworkCore.Extensions
里面的一个扩展方法,所以要手动添加using MySQL.Data.EntityFrameworkCore.Extensions;
命名空间。这个小问题也花费了我不少的时间和精力。
namespace MySQL.Data.EntityFrameworkCore.Extensions
{
/// <summary>
/// ContextOptionsExtensions implementations for MySQL
/// </summary>
public static class MySQLDbContextOptionsExtensions
{
public static DbContextOptionsBuilder UseMySQL(this DbContextOptionsBuilder optionsBuilder,
string connectionString,
Action<MySQLDbContextOptionsBuilder> MySQLOptionsAction = null)
{
var extension = optionsBuilder.Options.FindExtension<MySQLOptionsExtension>();
if (extension == null)
extension = new MySQLOptionsExtension();
extension.ConnectionString = connectionString;
IDbContextOptionsBuilderInfrastructure o = optionsBuilder as IDbContextOptionsBuilderInfrastructure;
o.AddOrUpdateExtension(extension);
MySQLOptionsAction?.Invoke(new MySQLDbContextOptionsBuilder(optionsBuilder));
return optionsBuilder;
}
}
//...
}
创建数据库
通过Migrations工具来创建数据库。
运行dotnet ef migrations add MyMigration
Entity Framework .NET Core CLI Migrations命令来创建一个初始化迁移命令。
运行dotnet ef database update
应用一个你所创建的新的迁移到数据库。因为你的数据库还没不存在,它会在迁移被应用之前为你创建所需的数据库。
然后就会在项目生成Migrations文件夹,包括20161121064725_MyMigration.cs文件、20161121064725_MyMigration.Designer.cs文件和UserContextModelSnapshot.cs文件:
20161121064725_MyMigration.Designer.cs类:
[DbContext(typeof(UserContext))]
[Migration("20161121064725_MyMigration")]
partial class MyMigration
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
modelBuilder
.HasAnnotation("ProductVersion", "1.0.0-rtm-21431");
modelBuilder.Entity("MyFirstApp.Models.User", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("Bio");
b.Property<string>("Email");
b.Property<string>("Name");
b.HasKey("ID");
b.ToTable("Users");
});
}
}
20161121064725_MyMigration.cs Partial类:
public partial class MyMigration : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
ID = table.Column<int>(nullable: false)
.Annotation("MySQL:AutoIncrement", true),
Bio = table.Column<string>(nullable: true),
Email = table.Column<string>(nullable: true),
Name = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Users", x => x.ID);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Users");
}
}
UserContextModelSnapshot类:
[DbContext(typeof(UserContext))]
partial class UserContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
modelBuilder
.HasAnnotation("ProductVersion", "1.0.0-rtm-21431");
modelBuilder.Entity("MyFirstApp.Models.User", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("Bio");
b.Property<string>("Email");
b.Property<string>("Name");
b.HasKey("ID");
b.ToTable("Users");
});
}
}
新创建的数据库结构如下:
将上述的Migrations文件夹中的代码与MySQL数据库表__EFMigrationsHistory
对照一下,你会发现该表是用来跟踪记录实际已经应用到数据库的迁移信息。
创建User实例并将实例保存到数据库
public class Program
{
public static void Main(string[] args)
{
using (var db = new UserContext())
{
db.Users.Add(new User { Name = "Charlie Chu", Email = "charlie.thinker@aliyun.com", Bio = "I am Chalrie Chu." });
var count = db.SaveChanges();
Console.WriteLine("{0} records saved to database", count);
Console.WriteLine();
Console.WriteLine("All users in database:");
foreach (var user in db.Users)
{
Console.WriteLine(" - {0}", user.Name);
}
}
}
}
参考文档
- HowTo: Starting with MySQL EF Core provider and Connector/Net 7.0.4
- .NET Core - New Database
- ASP.NET CORE 1.0 WITH MYSQL AND ENTITY FRAMEWORK CORE
- ASP.NET CORE 1.0 WITH SQLITE AND ENTITY FRAMEWORK 7
个人博客
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表的更多相关文章
- 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现
<在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...
- 在Entity Framework 中用 Code First 创建新的数据库
在Entity Framework 中用 Code First 创建新的数据库 (原文链接) 本文将逐步介绍怎样用Code First 创建新数据库,使用在代码中定义类和API中提供的特性(Attri ...
- ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...
- .NET Core学习笔记(8)——Entity Framework Core之Database First
曾经我以为再也不会去弄啥Database First,然鹅我错了.这个世界上就是有啪啪打脸和真香的时候.当小伙伴拿着做好的DB表结构和SQL脚本递过来的时候,我知道我没法拒绝.望着他突起的肱二头肌和充 ...
- ASP.NET Core 快速入门(Razor Pages + Entity Framework Core)
引子 自从 2009 年开始在博客园写文章,这是目前我写的最长的一篇文章了. 前前后后,我总共花了 5 天的时间,每天超过 3 小时不间断写作和代码调试.总共有 8 篇文章,每篇 5~6 个小结,总截 ...
- ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查
介绍 EntityFrameworkCore EF core 是一个轻量级的,可扩展的EF的跨平台版本.对于EF而言 EF core 包含许多提升和新特性,同时 EF core 是一个全新的代码库,并 ...
- ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查
身份验证 以前我们熟悉的web.config中配置的form验证,现在没有了.我们来看看在Core里面如何配置: 首先需要NuGet安装一个包:Microsoft.AspNetCore.Authent ...
- .NET Core学习笔记(9)——Entity Framework Core之Code First
上篇我们介绍了怎么通过已有的SQLServer表来创建实体类,本篇我们改用Code First的方式,由C#代码书写的实体类来生成SQLServer表.并且通过简单的Console APP往SQLSe ...
- Entity Framework 6 Code First创建
基本上我是DB先设计好的,所以就按现存在的table去写程式. 1.Web.config里配置Db连接字串,Connection String Name为DefaultConnection <c ...
随机推荐
- thrift ssl 证书整理
一.生成证书,所需机器数必须 >= 2(一台生成服务端证书,一台生成客户端证书),以下服务器以A表示服务端.B表示客户端来举例,thrift版本为0.7.01.自签名的证书的生成和测试 1)生成 ...
- XMLHTTPRequest对象的创建与浏览器的兼容问题
MLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpRequest ...
- HaProxy配置
安装 http://www.cnblogs.com/wang1988ming/archive/2012/10/24/2737507.html 配置 global log 127.0.0.1 local ...
- ABP理论学习之OData集成(新增)
返回总目录 本篇目录 介绍 安装 创建控制器 例子 样例项目 介绍 OData在其官网的定义是: 允许以一种 简单且标准的方式创建和使用可查询的.可互操作的RESTful APIs. 在ABP中也可以 ...
- Java NIO4:Socket通道
Socket通道 上文讲述了通道.文件通道,这篇文章来讲述一下Socket通道,Socket通道与文件通道有着不一样的特征,分三点说: 1.NIO的Socket通道类可以运行于非阻塞模式并且是可选择的 ...
- [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序
[.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序 本节导读: 本节主要说明使用异步进行程序设计的优缺点及如何通过异步编程. 使用 ...
- 去年做了什么?OA。
假前一天下午被经理和PM叫上楼,首要一个问题是我去年干了啥,我大致支吾了几句描述了下,一时也说不出个大概.后面就是一片悠长的面谈,什么没达到期望,公司状况不好.......哦,这是KPI评价啊,剩下的 ...
- Html5 实现灯笼绘制
最近在学习Html5,就用JavaScript在Canvas试着绘制了一个灯笼,并作了简要的说明. 具体绘制思路在页面上有说明,不再赘述,代码如下: <script type="tex ...
- Gitcafe绑定自定义域名
之前将自己练习写作工具替换为Markdown,部署工具改为Hexo,并且将托管地搬家到GitCafe之后,便是被各种的舒爽所围绕.具体折腾的详情参见使用Hexo搭建专属Blog.她们的组合方便快捷,让 ...
- javascript动画系列第五篇——模拟滚动条
× 目录 [1]原理介绍 [2]数字加减 [3]元素尺寸[4]内容滚动 前面的话 当元素内容溢出元素尺寸范围时,会出现滚动条.但由于滚动条在各浏览器下表现不同,兼容性不好.所以,模拟滚动条也是很常见的 ...