Entity Framework Core 2.0 使用入门

一.前言

Entity Framework(后面简称EF)作为微软家的ORM,自然而然从.NET Framework延续到了.NET Core。以前我也嫌弃EF太重而不去使用它,但是EF Core(Entity Framework Core)已经做了很多性能优化,还有一些增加新特性,吸引了我去使用它。关于EF Core 2.0 的新特性请看:http://www.cnblogs.com/stulzq/p/7366044.html

二.控制台程序使用 EF Core(Code First)

1.新建一个.NET Core控制台程序
2.通过Nuget安装 EF Core
  • Sql Server 请安装 Microsoft.EntityFrameworkCore.SqlServer

  • MySql/MariaDB请安装 Pomelo.EntityFrameworkCore.MySql (2.0及以上版本)

MySql/MariaDB 推荐使用Pomelo EF Core组件,因为官方的目前可能存在bug,Pomelo EF Core同样是微软官方所推荐的。

其他数据库请查看:https://docs.microsoft.com/zh-cn/ef/core/providers/

安装好EF Core之后,打开项目*.csproj文件 添加如下代码。

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

本文所用数据库为MariaDB

3.添加实体

public class Blog{
       public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; } }
public class Post{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; } }

4.添加数据库上下文

public class BloggingContext : DbContext{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
//配置mariadb连接字符串optionsBuilder.UseMySql("Server=localhost;Port=3306;Database=BloggingDB; User=root;Password=;");} }

5.使用

static void Main(string[] args){
using (var db = new BloggingContext()){db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/adonet" }); var count = db.SaveChanges();Console.WriteLine("{0} records saved to database", count);Console.WriteLine();Console.WriteLine("All blogs in database:");
foreach (var blog in db.Blogs){Console.WriteLine(" - {0}", blog.Url);}}Console.ReadKey(); }

现在F5运行,肯定会出异常的,因为我们需要使用的数据库并不存在,EF Core默认的创建数据库策略已经和EF不用,请看后面的迁移操作

三.ASP.NET Core 使用 EF Core(Code First)

1.创建一个asp.net core 2.0 mvc项目
2.通过Nuget安装 EF Core(同上)
3.添加实体(同上)
4.添加数据库上下文

public class BloggingContext : DbContext{
public BloggingContext(DbContextOptions<BloggingContext> options): base(options) { }
public DbSet<Blog> Blogs { get; set; }

public DbSet<Post> Posts { get; set; } }

5.配置EF Core

在Startup添加如下代码:

public void ConfigureServices(IServiceCollection services){services.AddDbContextPool<BloggingContext>(options => options.UseMySql("Server=localhost;Port=3306;Database=WebBloggingDB; User=root;Password=;")); //配置mariadb连接字符串}

6.在Controller中获取数据库上下文。

这里我们利用ASP.NET Core的依赖注入来获取数据库上下文。

private readonly BloggingContext _context;public BlogsController(BloggingContext context){_context = context; }

四.EF Core的迁移操作

前面说过,EF Core默认的创建数据库策略已经和EF不用,需要我们通过迁移来创建数据库

这里不论是是控制台还是ASP.NET Core操作都是一样的,这里以ASP.NET Core作为示例。

1.将ASP.NET Core项目设为启动项目
2.打开程序包管理器控制台,并选择对应的项目

3.执行添加迁移命令 Add-Migration init
4.迁移成功可以看见在项目根目录下添加了一个Migrations文件夹

5.更新迁移到数据库,执行命令 Update-Database

这时我们的数据库已经被创建!

现在就可以正常运行控制台或者ASP.NET Core程序了!

#EF Core迁移更新到生产环境

EF Core将迁移更新到生产环境可以使用Script-Migration命令生成sql脚本,然后到生产数据库执行

语法 Script-Migration [-From] <String> [-To] <String> [-Idempotent] [-Output <String>] [-Context <String>] [-Project <String>] [-StartupProject <String>] [<CommonParameters>]

示例:Script-Migration -From 20171023035934_v113 -To 20171024035934_V114

上面的命令会生成113版本迁移到114版本的SQL语句

生成SQL语句如下图:

还有一种方法就是通过代码进行自动迁移,这里暂时不做叙述,后面的文章会详细介绍。

五. EF Core 的 DB First

前面所介绍的都是Code First,这里介绍一下DB First,大型项目推荐使用DB First。

1.创建数据库(Sql Server)

CREATE DATABASE [Blogging]; GOUSE [Blogging]; GOCREATE TABLE [Blog] ([BlogId] int NOT NULL IDENTITY,[Url] nvarchar(max) NOT NULL,    CONSTRAINT [PK_Blog] PRIMARY KEY ([BlogId]) ); GOCREATE TABLE [Post] ([PostId] int NOT NULL IDENTITY,[BlogId] int NOT NULL,[Content] nvarchar(max),[Title] nvarchar(max),    CONSTRAINT [PK_Post] PRIMARY KEY ([PostId]),    CONSTRAINT [FK_Post_Blog_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blog] ([BlogId]) ON DELETE CASCADE); GOINSERT INTO [Blog] (Url) VALUES('http://blogs.msdn.com/dotnet'), ('http://blogs.msdn.com/webdev'), ('http://blogs.msdn.com/visualstudio')GO

2.新建一个.NET Core控制台程序
3.通过Nuget添加EF
  • 运行 Install-Package Microsoft.EntityFrameworkCore.SqlServer

  • 运行 Install-Package Microsoft.EntityFrameworkCore.Tools (EF工具包,创建实体)

4.执行下面的命令创建实体

Scaffold-DbContext "Data Source=.;Initial Catalog=Blogging;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

命令格式为:

Scaffold-DbContext "数据库连接字符串" EF组件名(Microsoft.EntityFrameworkCore.SqlServer/Pomelo.EntityFrameworkCore.MySql/等等) -OutputDir 输出文件夹名称

然后查看项目目录,可以看到一件多了一个Models文件夹,下面有创建的实体和数据库上下文。

ASP.NET Core项目操作是一样的。

本文Demo: https://github.com/stulzq/EntityFrameworkCore2Demo


原文地址:http://www.cnblogs.com/stulzq/p/7717873.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaFX中WebView的java与JS代码互相调用

java代码 package main;import javafx.application.Application; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.VBox; import javafx.scene.w…

【Python】有效资源爬取并集

由于爬虫代码都不多&#xff0c; 所以我决定在这篇博文上更新所有我觉得比较实用的python代码 方便以后自己调用 环境:python3.7 百度图片爬虫 二次元图片爬取 唐三小说爬取 文件格式命名 百度图片爬虫 百度图片网站 import re import requests from urllib import err…

[编程入门]带参数宏定义练习:定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。

#include<bits/stdc.h> #define fun(a,b) ta;ab;bt; using namespace std;int main() {int a,b,t;cin>>a>>b;fun(a,b);cout<<a<<" "<<b;return 0; }

Jexus~docker与它产生了暖味

前段时间写了很多docker for .net core的文章&#xff0c;用来快速部署微服务相当给力&#xff0c;而尝到了香头的我们希望把.net frameworks的程序也使用docker来部署一下&#xff0c;那么接下来我就结果一下&#xff0c;在linux,docker上运行和部署.net frameworks应用程序的…

P3870-[TJOI2009]开关【分块】

正题 解题思路:https://www.luogu.org/recordnew/lists?uid52918&pidP3870 题目大意 n个灯&#xff0c;操作[0,l,r][0,l,r][0,l,r]表示l∼rl\sim rl∼r的灯取反&#xff0c;操作[1,l,r][1,l,r][1,l,r]表示询问l∼rl\sim rl∼r之间有多少灯亮着。 解题思路 分块&#xf…

Linux运维常用检查网络工具

一、Ping ping可以检查网络是否连通&#xff0c;可以很好地帮助我们分析和判定网络故障。 ping ip 二、Telnet telnet通常用来查看某个端口是否可访问。 telnet ip port 三、Curl curl是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;1997年首次发行。它支持…

ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明

一.ABP的简单介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点&#xff0c;它旨在成为一个通用的WEB应用程序框架和项目模板。 ASP.NET Boilerplate 基于DDD的经典分层架构思想…

[编程入门]宏定义的练习:输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。

#include<bits/stdc.h> #define N a%b; using namespace std;int main() {int a,b;cin>>a>>b;cout<<N;return 0; }

jzoj3518-进化序列(evolve)【位运算】

正题 题目大意 序列aaa 求有多少个数(x,y)(x,y)(x,y)对满足: x<yx<yx<y和axorax1orax2...oray<ma_x\ or\ a_{x1}\ or\ a_{x2}...or\ a_y<max​ or ax1​ or ax2​...or ay​<m 解题思路 首先对于每个y&#xff0c;x满足单调性。 如果(x,y)(x,y)(x,y)可以那…

【Python】Scrapy的安装与使用

scrapy的安装 不得姐网站 直接用命令 pip install scrapy 网络可能较慢&#xff0c;等等就好 另外windows环境下你还需要安装win32 我之前就是因为没有安装这个库&#xff0c;白忙活了一天&#xff0c;一直都是报错状态 pip install pypiwin32 scrapy的使用 cd到卓面或者其他…

[译]ASP.NET Core 2.0 带初始参数的中间件

问题 如何在ASP.NET Core 2.0向中间件传入初始参数&#xff1f; 答案 在一个空项目中&#xff0c;创建一个POCO&#xff08;Plain Old CLR Object&#xff09;来保存中间件所需的参数&#xff1a; public class GreetingOptions { public string GreetAt { get; set; } …

【LSB】图片隐写

今天接触到个比较好玩的项目 用的是纯htmljs可以将图片里附着文本或图片 经过网页加工就可以将一些隐秘的信息传入到图片里面去了。 这个功能类似于用一种笔在纸上写字&#xff0c;这种字在正常情况下看不出来&#xff0c;而经过泼水之后就会有字的显现。 这种隐写功能也具…

[编程入门]宏定义之闰年判断:给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计

#include<bits/stdc.h> #define LEAP_YEAR(y) ((y%40&&y%100!0)||(y%4000)?"L":"N") using namespace std;int main() {int year;cin>>year;cout<<LEAP_YEAR(year);return 0; }

jzoj5223-B【矩阵乘法】

正题 题目大意 3∗33*33∗3的矩阵上每个格子都有机器人&#xff0c;每次可以向相邻格子移动或不动(一个格子上可以有多个机器人)&#xff0c;求移动nnn次后每个格子上都有机器人的移动方案数。 解题思路 用矩阵乘法计算出每个格子的机器人移动到每个格子的方案总数。 在枚举最…

框架学习与探究之AOP--Castle DynamicProxy

前言 先说一点废话&#xff0c;在此之前博主也在早期就接触了或者看了些许AOP相关的文章&#xff0c;然后再去做了一些相关的实验&#xff0c;但是始终没有将AOP内化到自己的内功心法当中去&#xff0c;包括从概念还是应用环境&#xff0c;以及当前生态当中的AOP工具等等&#…

【Css】基础属性(一)

给超过div的文本添加滑轮效果&#xff08;必须先对其高度进行设置&#xff09; overflow:auto; 给按钮添加圆润效果 border-radius: 20px; 设置组件居中&#xff08;文本居中&#xff09;&#xff0c;在组件外加div&#xff0c;给div加如下属性 text-align:center; 上文不奏效&…

jzoj100042-保留道路【最小生成树,图论】

正题 题目大意 一张无向图&#xff0c;求剩下一些边使图联通且wG∗max{gVi}wS∗max{sVi}wG*max\{g_{V_i}\}wS*max\{s_{V_i}\}wG∗max{gVi​​}wS∗max{sVi​​}最小 VVV表示选的边集 解题思路 我们可以枚举max{si}max\{s_i\}max{si​}的值&#xff0c;然后用ggg跑最小生成树。…

C++描述杭电OJ 2000. ASCII码排序 ||

C描述杭电OJ 2000. ASCII码排序 || Problem Description 输入三个字符后&#xff0c;按各字符的ASCII码从小到大的顺序输出这三个字符。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;有三个字符组成&#xff0c;之间无空格。 Output 对于每组输入数据&#xf…

【LSB】图片隐写文档大纲

第一章 绪论 1.1研究背景 1.2研究意义 1.3主要工作 第二章 图片隐写和LSB算法 2.1关于图片隐写术 2.2LSB算法 第三章 系统设计与实现 3.1图像的加载 3.2文本的预编码 3.3文字编码 3.4图片编码 第四章 功能测试及线上部署 4.1功能测试 4.2线上部署 第五章 总结及展望 5.1总结…

C++描述杭电OJ 2005.第几天? ||

C描述杭电OJ 2005.第几天&#xff1f;|| Problem Description 给定一个日期&#xff0c;输出这个日期是该年的第几天。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;数据格式为YYYY/MM/DD组成&#xff0c;具体参见sample input ,另外&#xff0c;可以向你确保所…