ASP.NET Core EFCore 属性配置与DbContext 详解
本文将深入探讨 ASP.NET Core 中 EFCore 的实体属性配置方法及 DbContext 的核心用法,帮助开发者高效管理数据模型与数据库交互。
一、属性配置
实体属性配置是定义模型与数据库映射的核心,EFCore 提供两种方式:数据注解和 Fluent API。
1. 数据注解(Data Annotations)
通过特性(Attributes)直接在实体类上声明配置,适合简单场景。
public class Product{
[Key] // 主键
public int Id { get; set; }
[Required, MaxLength(100)] // 非空且最大长度100
public string Name { get; set; }
[ForeignKey("CategoryId")] // 外键
public int CategoryId { get; set; }
public Category Category { get; set; }}
常用注解:
[Key]:主键[Required]:非空约束[MaxLength(length)]:最大长度[ForeignKey]:外键关系[Table("TableName")]:自定义表名
2. Fluent API
在 DbContext 的 OnModelCreating 方法中配置,提供更灵活的方式。
protected override void OnModelCreating(ModelBuilder modelBuilder){
modelBuilder.Entity<Product>(entity => {
entity.HasKey(p => p.Id); // 主键
entity.Property(p => p.Name)
.IsRequired()
.HasMaxLength(100);
entity.HasOne(p => p.Category) // 一对一/多关系
.WithMany(c => c.Products)
.HasForeignKey(p => p.CategoryId);
});}
常用配置方法:
HasKey():定义主键Property().IsRequired():非空约束HasIndex():创建索引HasOne().WithMany():配置导航关系
优势:
集中管理配置,避免污染实体类。
支持复杂配置(如复合主键、继承映射)。
二、DbContext 详解
DbContext 是 EFCore 的核心,负责数据库连接、查询、事务管理等。
1. 定义 DbContext
派生类需继承 DbContext,并暴露 DbSet<T> 属性。
public class AppDbContext : DbContext{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer("Your_Connection_String");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Fluent API 配置
}
}
2. 生命周期与依赖注入
在 ASP.NET Core 中,通过依赖注入管理上下文生命周期:
// Startup.cs
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Default")));
作用域(Scoped):默认选项,每个请求一个实例,确保线程安全。
避免长时间持有
DbContext,以防内存泄漏。
3. 数据操作
查询:
var products = await _context.Products.Where(p => p.Price > 50).ToListAsync();
保存变更:
_context.Products.Add(newProduct);
await _context.SaveChangesAsync();
关键方法:
Add(),Remove():跟踪实体状态SaveChangesAsync():提交事务
4. 性能优化
AsNoTracking():禁用变更跟踪,提升查询速度。
DbContext 池:复用上下文实例,减少开销。
services.AddDbContextPool<AppDbContext>(...);
三、高级配置
1. 多对多关系
使用 Fluent API 配置中间表:
modelBuilder.Entity<Post>()
.HasMany(p => p.Tags)
.WithMany(t => t.Posts)
.UsingEntity(j => j.ToTable("PostTags"));
2. 继承映射
TPH(Table-Per-Hierarchy)模式:
modelBuilder.Entity<Blog>()
.HasDiscriminator<string>("BlogType")
.HasValue<Blog>("Standard")
.HasValue<RssBlog>("RSS");
3. 全局过滤器
自动应用查询条件(如软删除):
modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
四、最佳实践与常见问题
选择数据注解还是 Fluent API?
简单配置用数据注解,复杂需求用 Fluent API。
DbContext 线程安全
确保每个请求使用独立实例,避免并发问题。
迁移(Migrations)
通过
dotnet ef migrations add生成数据库架构变更。性能陷阱
避免在循环中频繁调用
SaveChanges()。使用
Include()预加载关联数据,减少 N+1 查询。
结语
掌握 EFCore 的属性配置与 DbContext 管理,能够显著提升数据层开发效率。合理选择配置方式,结合依赖注入和性能优化技巧,可构建高效稳健的 ASP.NET Core 应用。
ASP.NET Core EFCore 属性配置与DbContext 详解的更多相关文章
- ASP.NET Core MVC 源码学习:详解 Action 的激活
前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...
- ASP.NET Core MVC 源码学习:详解 Action 的匹配
前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...
- ASP.NET Core托管运行Quartz.NET作业调度详解
Quartz.NET这么NB的作业调度系统,不会还行? 今天介绍一下Quartz.NET的托管运行,官网传送门. 一.前言 Quartz.NET,按官网上的说法,是一款功能齐全的任务调度系统,从小 ...
- Asp.Net Core 中IdentityServer4 实战之 Claim详解
一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...
- DevExpress ASP.NET Core Controls v18.2新功能详解
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Core ...
- springboot快速入门(二)——项目属性配置(日志详解)
一.概述 application.properties就是springboot的属性配置文件 在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring ...
- asp.net中web.config配置节点大全详解
最近网上找了一些关于Web.config配置节点的文章,发现很多都写的都比较零散,而且很少有说明各个配置节点的作用和用法.搜索了一下发现有一篇写的不错,这里引用一下 原文地址 http://www.c ...
- asp.net中web.config配置节点大全详解【转】
web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所在目录下不存在web ...
- ASP.NET Core开发-如何配置Kestrel 网址Urls
ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls. ...
- asp.net core 将配置文件配置迁移到数据库(一)
asp.net core 将配置文件配置迁移到数据库(一) Intro asp.net core 配置默认是项目根目录下的 appsettings.json 文件,还有环境变量以及 command l ...
随机推荐
- vue打印浏览器页面功能的两种实现方法
目录 方法一:通过npm 安装插件 方法二:手动下载插件到本地 总结 推荐使用方法二 方法一:通过npm 安装插件 1,安装 npm install vue-print-nb --save 2,引入 ...
- 光猫路由器设置-改桥接、开启UPNP和DMZ的教程
疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 以电信光猫举例,其他网络百度都有对应教程. 电信光猫 ...
- Ansible - [02] 基础配置以及常用操作场景
Ansible 基础配置 主配置文件:/etc/ansible/ansible.cfg ansible配置文件查找顺序 首先检测ANSIBLE_CONFIG变量定义的配置 其次检查当前目录下的./an ...
- Scala查看源码
package com.wyh.day01 /** * 1.代码格式化的快捷键 ctrl+alt+L\ * 2.scala查看源代码的快捷键 ctrl+b */ object ScalaLookSou ...
- Chrome 133 里程碑式更新 - moveBefore, 或开启前端框架未来新纪元?
相关背景: Chrome 133 版本(将于 2 月 4 日发布稳定版)引入了一个新的 DOM 操作方法:Node.prototype.moveBefore.这一方法虽然看似简单,但其意义重大,因为它 ...
- AI 插件第二弹,更强更好用
概述 插件大更新 前一周, 我们开源了一个 AI 插件,发了一篇介绍的文章 DeepSeek 插件开源上线!支持多家云服务,一键解锁满血版 AI 引来了一些小小的反响,也有用户在评论区或者私底下提了一 ...
- 写一个简单的SQL生成工具
知识点: MyBatis 语法概览 MyBatis 是一个强大的数据持久化框架,它提供了一种半自动化的 ORM 实现方式.通过 MyBatis,开发者可以通过简单的 XML 或注解来配置和映射原生信息 ...
- wordpress无法显示gitee图床的图片
wordpress无法显示gitee图床的图片 Question:如题 Solution:是防盗链的问题,gitee官网给出了防盗链的方法,而github貌似没有. Reference:你已经是个成熟 ...
- [tldr]通过指令获取github仓库的单个文件的内容
针对一个公开的github仓库,有些时候不需要clone整个仓库的内容,只需要对应的几个文件.但是直接通过网页点击下载文件很麻烦,在服务器上也不好这样操作. 因此,如何使用curl或者wget指令快速 ...
- IM服务器:一个使用imserver服务器进行聊天的web端案例
该案例中包含一个基于web网页的前端程序,该案例会使用websocket与IM服务器(imserver)进行通信. 一.环境准备 1.下载 "imserver网页调用案例",并解压 ...