1.管理数据库链接
2.配置实体关系映射
3.数据库查询,新增,修改,删除数据
4.配置变化跟踪
5.缓存
6.事务管理
1 EF Core 例子
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 7.0.4我们也可以使用.NET CLI 安装相应的包
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 7.0.41.Department – 部门信息表
2.Employee – 员工信息表
创建 2 个实体和这两张表做映射,在项目 Models 文件夹下创建 Department & Empl oyee 类,类代码如下:
namespaceEFCoreDbContext.Models{publicclassDepartment{publicint Id { get; set; }publicstring Name { get; set; }public ICollection<Employee> Employee { get; set; }}}
namespaceEFCoreDbContext.Models{publicclassEmployee{publicint Id { get; set; }publicint DepartmentId { get; set; }publicstring Name { get; set; }publicstring Designation { get; set; }public Department Department { get; set; }}}
我们在应用程序的 Models 文件夹内创建一个 CompanyContext 类并且继承自 DbContext 类,该类在 Microsoft.EntityFrame
namespaceEFCoreDbContext.Models{publicclassCompanyContext : DbContext{public CompanyContext(DbContextOptions<CompanyContext> options): base(options){}}}
DbSet表示实体的集合,是对实体执行数据库操作的入口Company
namespaceEFCoreDbContext.Models{publicclassCompanyContext : DbContext{public CompanyContext(DbContextOptions<CompanyContext> options): base(options){}public DbSet<Department> Departments { get; set; }public DbSet<Employee> Employees { get; set; }}}
namespaceEFCoreDbContext.Models{publicclassCompanyContext : DbContext{public CompanyContext(DbContextOptions<CompanyContext> options): base(options){}public DbSet<Department> Departments { get; set; }public DbSet<Employee> Employees { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Department>(entity =>{entity.Property(e => e.Name).IsRequired().HasMaxLength(50).IsUnicode(false);});modelBuilder.Entity<Employee>(entity =>{entity.Property(e => e.Designation).IsRequired().HasMaxLength(25).IsUnicode(false);entity.Property(e => e.Name).IsRequired().HasMaxLength(100).IsUnicode(false);entity.HasOne(e => e.Department).WithMany(p => p.Employee).HasForeignKey(d => d.DepartmentId).OnDelete(DeleteBehavior.ClientSetNull).HasConstraintName("FK_Employee_Department");});}}}
我们已经配置了 Department 和 Employee 实体类,我们通过使用 IsRequired 方法确保字段是必填项,类似的使用 HasMaxLength(100)方法设置 employee 类属性的最大长度,代码使用外键设置实体的一对多关系
.HasForeignKey(d => d.DepartmentId).OnDelete(DeleteBehavior.ClientSetNull).HasConstraintName("FK_Employee_Department");
2.2 注册 DBContext
using EFCoreExample.Models;using Microsoft.EntityFrameworkCore;var builder = WebApplication.CreateBuilder(args);builder.Services.AddDbContext<CompanyContext>(options =>options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));// Add services to the container.builder.Services.AddControllersWithViews();var app = builder.Build();.....
2.3 配置数据库链接字符串
我们将数据库链接字符串存储到项目配置文件appsettings.json,因此添加数据库链接字符串
{"ConnectionStrings": {"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=EFCoreDbContext;Trusted_Connection=True;MultipleActiveResultSets=true"}}
2.4.1 Add Migration Command
add-migration Migration1
2.4.2 Update Migration Command
Update-Database2.5 DbContext 方法
现在我们检查一下 SQL Server 发现数据库已经被创建,EF Core DbContext 有一些重要的方法:
| 名称 | 描述 |
|---|---|
| Add | 使用 Added 状态添加一个实 |
| AddRange | Add 的批量版本 |
| Attach | 使用该方法会将实体设置为 Unchanged 状态 |
| AttachRange | Attach 的批量版本 |
| Remove | 将实体状态设置为 deleted 状态 |
| RemoveRange | Remove 的批量版本 |
| Update | 设置实体被跟踪并且修改实体状态为 Modified,并且会跟踪关联实体,如果该实体关联一个集合,会导致每一个实体生成一个 update 语句,如果对应实体主键没有值,将会设置为 Added 状态,生成对应的 insert 语句 |
| UpdateRange | Update 的批量版本 |
| SaveChanges | 将实体中使用了 Added、Modified、Deleted 状态的数据执行对应的 INSERT、UPDATE、DELETE 操作并将其更新到数据库中 |
2.5.1 测试
现在我们测试一下是否能正常工作,我们使用 EF Core 插入一条记录,我们在 HomeController 中添加如下代码:
using EFCoreExample.Models;using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;namespaceEFCoreExample.Controllers{publicclassHomeController : Controller{private CompanyContext context;public HomeController(CompanyContext cc){context = cc;}public IActionResult Index(){var dept = new Department(){Name = "Designing"};context.Entry(dept).State = EntityState.Added;context.SaveChanges();return View();}}}
private CompanyContext context;public HomeController(CompanyContext cc){context = cc;}
var dept = new Department(){Name = "Designing"};context.Entry(dept).State = EntityState.Added;context.SaveChanges();
运行应用程序并在浏览器中初始化这个方法这将在数据库 Depart
ment 表中插入一条新的记录,打开表发现一条新的记录被添加,如下图所示

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){if (!optionsBuilder.IsConfigured){optionsBuilder.UseSqlServer(@"Server=vaio;Database=Company;Trusted_Connection=True;");}}