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];
GO

USE [Blogging];
GO

CREATE TABLE [Blog] (
    [BlogId] int NOT NULL IDENTITY,
    [Url] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_Blog] PRIMARY KEY ([BlogId])
);
GO

CREATE 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
);
GO

INSERT 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

ASP.NET MVC 2的代码以MS-PL协议开源发布

微软已经宣布ASP.NET MVC 2的代码以MS-PL协议发布,MS-PL是一个得到OSI认证的开源协议,ASP.NET MVC基于MS-PL发布,是一个真正...

1766
来自专栏朱慕之的博客

RunLoop

RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之...

1102
来自专栏debugeeker的专栏

source insight另一个coredump

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

773
来自专栏逆向技术

win32线程

3.单核CPU可以实现多线程. 几秒钟换一次线程执行不同进程的代码.就实现了多线程.

681
来自专栏wym

socket---TCP服务器界面

#include<winsock2.h> #pragma comment(lib,"ws2_32.lib") #define DEFAULT_iPor...

1112
来自专栏施炯的IoT开发专栏

Visual Studio 2013 Update 2 RTM 发布

今天,微软再Visual Studio Blog发布了开放 Visual Studio 2013 Update 2 RTM 下载的文章。 原来安装RC版本的同志...

18010
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - RunLoop

5797
来自专栏自由而无用的灵魂的碎碎念

介绍CodeRush Xpress for C#

用过Eclipse编写java代码,感觉它的某些功能在visual studio 中是没有的,比如Toggle Mark Occurrences:

1022
来自专栏草根专栏

在asp.net web api 2 (ioc autofac) 使用 Serilog 记录日志

Serilog是.net里面非常不错的记录日志的库,另外一个我认为比较好的Log库是NLog。 在我个人的asp.net web api 2 基础框架(Gith...

4408
来自专栏张善友的专栏

Json.NET 3.0

Json.NET,提供相当完整的文档之外,还提供了 LINQ to JSON 的 LINQ Provider 可以更方便的读取JSON 对象,今后将可比以往用更...

1916

扫码关注云+社区