Entity Framework Core(简称 EF Core)是 .NET Core 中的一个开源对象关系映射(ORM)框架。它允许开发者以面向对象的方式与数据库进行交互,从而简化了数据库访问的复杂性。EF Core 是 Entity Framework 的跨平台版本,支持 .NET Core 以及 .NET Framework。
DbContext 是 EF Core 的核心类,它代表了应用程序与数据库之间的会话。通过 DbContext,开发者可以查询和操作数据库。DbContext 包含了一系列的 DbSet 属性,每个 DbSet 对应一个数据库表。以下是一个简单的 DbContext 示例:
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("YourConnectionString");
}
}
在上述代码中,BloggingContext 继承自 DbContext,并定义了两个 DbSet 属性:Blogs 和 Posts。OnConfiguring 方法用于配置数据库连接字符串。
实体类代表了数据库中的表。通过定义实体类的属性,可以映射数据库表中的列。EF Core 使用约定大于配置的原则,自动将实体类映射到数据库表。以下是一个简单的实体类示例:
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public int Rating { get; set; }
}
在上述代码中,Blog 类的属性 BlogId、Url 和 Rating 分别对应数据库表中的列。
迁移是 EF Core 中用于管理数据库结构变更的机制。通过迁移,开发者可以在开发过程中轻松地添加、修改或删除数据库表和字段。迁移的步骤通常包括以下几步:
Add-Migration 添加一个新的迁移。EF Core 会根据当前的模型和数据库结构生成迁移脚本。Update-Database 应用迁移,更新数据库结构。using (var context = new BloggingContext())
{
var blog = new Blog { Url = "http://example.com" };
context.Blogs.Add(blog);
context.SaveChanges();
}
在上述代码中,创建了一个新的 Blog 实体,并将其添加到 Blogs DbSet 中。调用 SaveChanges 方法将数据保存到数据库。
using (var context = new BloggingContext())
{
var blogs = context.Blogs
.Where(b => b.Rating > 3)
.OrderBy(b => b.Url)
.ToList();
}
在上述代码中,使用 LINQ 查询语句查询出评分大于 3 的博客,并按 URL 排序。
using (var context = new BloggingContext())
{
var blog = context.Blogs.FirstOrDefault(b => b.BlogId == 1);
if (blog != null)
{
blog.Url = "http://newexample.com";
context.SaveChanges();
}
}
在上述代码中,查询出 ID 为 1 的博客,并修改其 URL。调用 SaveChanges 方法将修改保存到数据库。
using (var context = new BloggingContext())
{
var blog = context.Blogs.FirstOrDefault(b => b.BlogId == 1);
if (blog != null)
{
context.Blogs.Remove(blog);
context.SaveChanges();
}
}
在上述代码中,查询出 ID 为 1 的博客,并将其从 Blogs DbSet 中移除。调用 SaveChanges 方法将删除操作保存到数据库。
EF Core 支持多种关系配置,包括一对一、一对多和多对多关系。以下是一个一对多关系的示例:
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; }
}
在上述代码中,Blog 类包含一个 Posts 属性,表示一个博客可以有多个帖子。Post 类包含一个 BlogId 属性和一个 Blog 属性,表示一个帖子属于一个博客。
在 EF Core 7.0 中,SaveChanges 和 SaveChangesAsync 的性能得到了显著改善。在某些情况下,保存更改的速度比 EF Core 6.0 快四倍。其中大多数改进来自执行到数据库的往返次数更少。例如,EF Core 7.0 避免在不需要的情况下启动显式事务。
EF Core 8/9 优化了查询编译和执行,从而减少了复杂查询的延迟。这些改进在执行大量动态查询或严重依赖 LINQ 进行业务逻辑的应用程序中尤为明显。
EF Core 8/9 增强了批量操作的性能。通过批量操作,可以一次性执行多个数据库操作,减少了数据库往返次数。例如,批量插入数据时,可以将多个插入操作合并为一个 SQL 语句。
EF Core 的更改跟踪机制会缓存实体的状态。在处理大量数据时,可以考虑禁用更改跟踪,以提高查询性能。例如,在只读查询中,可以使用 AsNoTracking 方法:
var blogs = context.Blogs.AsNoTracking().ToList();
EF Core 7.0 引入了许多新功能和改进。除了性能方面的优化,还增强了对 JSON 数据的支持。例如,可以更高效地查询和映射 JSON 数据。
EF Core 8/9 继续优化性能和开发人员工作效率。它提供了
原文作者:后端Q;如有侵权,请联系管理员删除。