Entity Framework Core(简称EF Core)是一个现代的、跨平台的、开源的对象关系映射(ORM)框架,由微软开发。它允许.NET开发者通过.NET对象与关系型数据库进行交互,而无需编写大部分的数据访问代码,极大地简化了数据访问的过程。以下是关于EF Core的详细概念和原理介绍:
一、概念
1. ORM框架
- ORM(Object-Relational Mapping)框架是一种程序设计技术,用于实现编程语言中的对象模型与数据库中的关系模型之间的映射。EF Core正是这种技术的实现,它将数据库中的表、行、列等关系型数据结构映射为编程语言中的类、对象、属性等面向对象的数据结构。
2. 跨平台与开源
- EF Core支持多种.NET实现和操作系统,包括.NET Core、.NET Framework、Xamarin、Universal Windows Platform (UWP)以及.NET Standard。这意味着开发者可以在不同的平台和环境中使用EF Core进行数据库操作。
- EF Core是开源的,其源代码托管在GitHub上,允许开发者查看、修改和贡献代码。
3. 数据访问自动化
- EF Core可以自动将LINQ(Language Integrated Query)查询转换为SQL命令,使得数据访问更加直观和简单。开发者只需要使用LINQ编写查询语句,EF Core就会将其转换为相应的SQL语句并执行,然后将结果返回给开发者。
二、原理
1. 实体与数据库表的映射
- EF Core通过实体类(Entity Class)与数据库表之间的映射关系,将数据库中的表映射为编程语言中的类,将表中的行映射为类的实例,将列映射为类的属性。这种映射关系是通过EF Core的模型构建器(ModelBuilder)或数据注解(Data Annotations)来配置的。
2. 上下文(DbContext)
- DbContext是EF Core中的一个核心概念,它代表了与数据库的会话(Session)和缓存(Cache)。DbContext包含了与数据库交互所需的所有信息,包括数据库连接字符串、实体类型、数据库迁移信息等。开发者通过DbContext来执行数据库查询、插入、更新和删除等操作。
3. 变更跟踪(Change Tracking)
- EF Core通过变更跟踪机制来自动跟踪实体状态的变化。当开发者对实体实例的属性进行修改时,EF Core会自动将这些变化记录下来,并在执行SaveChanges()方法时将这些变化同步到数据库中。这种机制极大地简化了数据更新的过程,使得开发者无需手动编写更新语句。
4. 延迟加载与立即加载
- EF Core支持两种数据加载方式:延迟加载(Lazy Loading)和立即加载(Eager Loading)。延迟加载是在访问导航属性时自动从数据库中加载相关数据,而立即加载则是在执行查询时一次性加载所有相关数据。开发者可以根据实际需求选择合适的加载方式。
以下是一个简单的示例,演示如何在一个.NET Core(或.NET 5/6/等更高版本)控制台应用程序中配置Entity Framework Core。
首先,确保你的项目中已经安装了Entity Framework Core NuGet包。你可以通过NuGet包管理器或.csproj
文件来安装。对于Entity Framework Core 5.0,你可以在.csproj
文件中添加如下依赖项:
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0" /> <!-- 如果你使用的是SQL Server -->
<!-- 对于其他数据库,请相应地添加适当的提供程序包,例如MySql.EntityFrameworkCore等 -->
</ItemGroup>
接下来,我们定义一个简单的实体类(Model)和数据库上下文(DbContext)类。
实体类(Model)
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
// 假设每个Blog有多个Posts
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
// 外键指向Blog
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
数据库上下文(DbContext)
using Microsoft.EntityFrameworkCore;
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 这里配置了连接到本地SQL Server的字符串
// 请根据实际情况调整连接字符串
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 在这里可以配置模型,例如Fluent API
modelBuilder.Entity<Blog>()
.HasMany(b => b.Posts)
.WithOne(p => p.Blog)
.HasForeignKey(p => p.BlogId);
}
}
OnConfiguring
方法中的数据库连接字符串仅用于演示目的,并假定你正在使用SQL Server LocalDB。你应该根据自己的数据库配置来修改这个连接字符串。
在实际应用中,你可能会在Startup.cs
(对于ASP.NET Core应用程序)或程序的入口点(对于控制台应用程序)中配置DbContext
,而不是直接在DbContext
类中配置。
对于控制台应用程序,你可能想要将数据库配置移动到Main
方法或另一个初始化方法中,以避免在DbContext
类中硬编码数据库连接字符串。这可以通过使用依赖注入(DI)或简单地在应用程序启动时创建DbContext
实例并传递连接字符串来实现。上述示例提供了直接在DbContext
中配置数据库连接的基本方法。