ASP.NET Core 中的 ORM 之 Entity Framework

EF Core 简介

Entity Framework Core 是微软自家的 ORM 框架。作为 .Net Core 生态中的一个重要组成部分,它是一个支持跨平台的全新版本,用三个词来概况 EF Core 的特点:轻量级、可扩展、跨平台。

目前 EF Core 支持的数据库:

Microsoft SQL Server

SQLite

Postgres (Npgsql)

SQL Server Compact Edition

InMemory (for testing purposes)

MySQL

IBM DB2

Oracle

Firebird

使用 EF Core(Code First)

新建一个 WebAPI 项目

通过 Nuget 安装 EF Core 引用

// SQL Server Install-Package Microsoft.EntityFrameworkCore.SqlServer

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

添加实体

public class Blog { public int BlogId { get; set; } public string Url { get; set; } public int Rating { 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; } }

添加数据库上下文

public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } }

有两种方式配置数据库连接,一种是注册 Context 的时候提供 options。比较推荐这种方式。

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

在 Startup 中配置

public void ConfigureServices(IServiceCollection services) { var connectionString = @"Server=.;Database=Blogging;Trusted_Connection=True;"; services.AddDbContext<BloggingContext>(o => o.UseSqlServer(connectionString)); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }

一种是重载 OnConfiguring 方法提供连接字符串:

public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=.;Database=Blogging;Trusted_Connection=True;"); base.OnConfiguring(optionsBuilder); } }

在Controller 中使用 Context

public class BlogsController : ControllerBase { private readonly BloggingContext _context; public BlogsController(BloggingContext context) { _context = context; } // GET: api/Blogs [HttpGet] public IEnumerable<Blog> GetBlogs() { return _context.Blogs; } } 迁移 Migration

通过 Nuget 引入EF Core Tool 的引用

Install-Package Microsoft.EntityFrameworkCore.Tools

如果需要使用 dotnet ef 命令, 请添加 Microsoft.EntityFrameworkCore.Tools.DotNet

生成迁移

打开Package Manager Console,执行命令 Add-Migration InitialCreate。
执行成功后会在项目下生成一个 Migrations目录,包含两个文件:

BloggingContextModelSnapshot:当前Model的快照(状态)。

20180828074905_InitialCreate:这里面包含着migration builder需要的代码,用来迁移这个版本的数据库。里面有Up方法,就是从当前版本升级到下一个版本;还有Down方法,就是从下一个版本再退回到当前版本。

更新迁移到数据库

执行命令 Update-Database。
如果执行成功,数据库应该已经创建成功了。现在可以测试刚才创建的WebAPI应用了。

使用代码 Database.Migrate(); 可以达到同样的目的

public BloggingContext(DbContextOptions<BloggingContext> options) : base(options) { Database.Migrate(); }

EF Core 中的一些常用知识点 实体建模

EF 根据对 Model 的配置生成表和字段,主要有三种配置方式:

约定 根据约定(Id 或者

Data Annotation 数据注解

using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class Blog { [Key] [Column("BlogId")] public int BlogId { get; set; } [Required] [MaxLength(500)] public string Url { get; set; } public int Rating { get; set; } public List<Post> Posts { get; set; } }

Key: 主键

Required:不能为空

MinLength:字符串最小长度

MaxLength:字符串最大长度

StringLength:字符串最大长度

Timestamp:rowversion,时间戳列

ConcurrencyCheck 乐观并发检查列

Table 表名

Column 字段名

Index 索引

ForeignKey 外键

NotMapped 不映射数据库中的任何列

InverseProperty 指定导航属性和实体关系的对应,用于实体中有多个关系映射。

Fluent API

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgffdz.html