Entity Framework (EF) 是微软提供的一款面向对象的关系映射(ORM)框架,旨在让开发者能够使用面向对象的编程方式操作数据库。它抽象了底层数据库操作,使得开发者可以使用C#等高级编程语言来操作数据库,而无需编写大量的SQL代码。
目录
主要功能
- 代码优先(Code First):通过定义类来创建数据库结构。
- 数据库优先(Database First):根据已有的数据库生成相应的类和上下文。
- 模型优先(Model First):使用设计器创建模型,然后生成数据库和代码。
使用步骤
-
安装Entity Framework:
使用NuGet包管理器安装Entity Framework:Install-Package EntityFramework
-
创建模型类:
定义你的实体类,这些类将映射到数据库表中。 -
创建上下文类:
上下文类继承自DbContext
,并包含所有实体类的DbSet
属性。 -
配置连接字符串:
在应用程序的配置文件中添加连接字符串。 -
执行数据库操作:
使用LINQ或EF提供的API来执行CRUD操作。
示例项目
1. 安装Entity Framework
通过NuGet包管理器控制台安装Entity Framework:
Install-Package EntityFramework
2. 创建模型类
创建一个简单的模型类,比如Student
类:
public class Student
{
public int StudentId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime EnrollmentDate { get; set; }
}
3. 创建上下文类
创建一个上下文类,继承自DbContext
:
using System.Data.Entity;
public class SchoolContext : DbContext
{
public DbSet<Student> Students { get; set; }
}
4. 配置连接字符串
在App.config
或Web.config
文件中添加连接字符串:
<configuration>
<connectionStrings>
<add name="SchoolContext"
connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=SchoolDB;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
5. 执行数据库操作
在程序中使用上下文类来执行数据库操作,例如添加、读取、更新和删除学生记录:
class Program
{
static void Main(string[] args)
{
using (var context = new SchoolContext())
{
// 添加新学生
var student = new Student
{
FirstName = "John",
LastName = "Doe",
EnrollmentDate = DateTime.Now
};
context.Students.Add(student);
context.SaveChanges();
// 读取学生数据
var students = context.Students.ToList();
foreach (var s in students)
{
Console.WriteLine($"{s.FirstName} {s.LastName}");
}
// 更新学生数据
var studentToUpdate = context.Students.FirstOrDefault();
if (studentToUpdate != null)
{
studentToUpdate.FirstName = "Jane";
context.SaveChanges();
}
// 删除学生数据
var studentToDelete = context.Students.FirstOrDefault();
if (studentToDelete != null)
{
context.Students.Remove(studentToDelete);
context.SaveChanges();
}
}
}
}
详细概述
1. 代码优先(Code First)
这种方法最适合从头开始编写代码,而不是基于现有数据库。开发者首先编写实体类,然后根据这些类生成数据库。
- 定义实体类:在上述示例中,我们定义了
Student
类。 - 配置数据库:通过数据注解或Fluent API配置数据库架构。
- 生成数据库:使用
DbContext
类自动生成数据库。
2. 数据库优先(Database First)
这种方法适用于已有数据库的情况。EF可以基于现有数据库生成实体类和上下文类。
- 使用Entity Data Model Wizard:在Visual Studio中使用“添加新项”向导,选择“ADO.NET Entity Data Model”,然后选择“从数据库生成”。
- 生成实体类:向导会自动生成与数据库表对应的实体类。
- 生成上下文类:向导会生成上下文类,使开发者能够使用这些类与数据库进行交互。
3. 模型优先(Model First)
这种方法介于代码优先和数据库优先之间。开发者可以使用EF设计器创建模型,然后生成数据库和代码。
- 创建模型:使用EF设计器创建实体模型。
- 生成数据库:从模型生成数据库。
- 生成代码:从模型生成实体类和上下文类。
高级特性
1. 数据迁移
EF提供了数据库迁移功能,允许开发者在不丢失数据的情况下对数据库架构进行更改。
启用迁移:
Enable-Migrations
添加迁移:
Add-Migration InitialCreate
更新数据库:
Update-Database
2. 事务处理
EF支持事务处理,确保多条数据库操作在一个事务中执行,以保证数据一致性。
using (var context = new SchoolContext())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
// 执行多个数据库操作
context.Students.Add(new Student { FirstName = "Alice", LastName = "Smith" });
context.SaveChanges();
context.Students.Add(new Student { FirstName = "Bob", LastName = "Johnson" });
context.SaveChanges();
// 提交事务
transaction.Commit();
}
catch (Exception)
{
// 回滚事务
transaction.Rollback();
}
}
}
3. 性能优化
EF提供了一些性能优化技术,例如延迟加载、显式加载和预加载。
- 延迟加载:默认情况下,EF会延迟加载导航属性。这意味着在访问导航属性时,EF会自动从数据库加载相关数据。
- 显式加载:使用
Load
方法显式加载导航属性。 - 预加载:使用
Include
方法在查询时预先加载相关数据。
// 延迟加载
var student = context.Students.Find(1);
// 显式加载
context.Entry(student).Collection(s => s.Enrollments).Load();
// 预加载
var students = context.Students.Include(s => s.Enrollments).ToList();
总结
Entity Framework简化了数据库操作,使开发者可以使用面向对象的方式操作数据库。它提供了代码优先、数据库优先和模型优先三种开发模式,并支持高级特性如数据库迁移、事务处理和性能优化。通过EF,开发者可以更专注于业务逻辑,而不需要处理繁琐的数据库操作。