zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    BZOJ 4316: 小C的独立集 (仙人掌,树形DP)
    LOJ #2587. 「APIO2018」铁人两项 (圆方树,树形DP)
    BZOJ 5329: [Sdoi2018]战略游戏 (圆方树,树链的并)
    CF487E Tourists (圆方树,LCT)
    BZOJ 4873: [Shoi2017]寿司餐厅 最大权闭合图
    【转】python文件打开方式详解——a、a+、r+、w+区别
    【转】使用git将项目上传到github(最简单方法)
    整数型数组组合成字符串
    【转】浏览器中输入url后发生了什么
    去除列表中重复的元素
  • 原文地址:https://www.cnblogs.com/stulzq/p/7717873.html
Copyright © 2011-2022 走看看