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