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.4
1.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
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.ClientSet)
.HasConstraintName("FK_Employee_Department");
});
}
}
}
我们已经配置了 Department 和 Employee 实体类,我们通过使用 IsRequired 方法确保字段是必填项,类似的使用 HasMaxLength(100)方法设置 employee 类属性的最大长度,代码使用外键设置实体的一对多关系
.HasForeignKey(d => d.DepartmentId)
.OnDelete(DeleteBehavior.ClientSet)
.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-Database
2.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;");
}
}
参考资料
[1]https://learn.microsoft.com/en-us/ef/core/dbcontext-configuration/#dbcontext-in-dependency-injection-for-aspnet-core [2]https://www.yogihosting.com/dbcontext-entity-framework-core/ [3]https://www.learnentityframeworkcore.com/dbcontext/adding-data [4]https://www.nuget.org/
本文暂时没有评论,来添加一个吧(●'◡'●)