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 ...
随机推荐
- Arduino语法--数据类型
Arduino与C语言类似,有多种数据类型.数据类型在数据结构中的定义是一个值的集合,以及定义在这个值集上的一组操作,各种数据类型需要在特定的地方使用.一般来说,变量的数据类型决定了如何将代表这些值的 ...
- STM32中如何使用printf()函数
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 在STM32串口通信程序中使用printf发送数据,非常的方便.可在刚开始使用的时候总是遇到问题,常见的是硬件访 ...
- Landsat遥感影像分幅条带介绍与矢量下载:WRS的Path与Row
本文介绍Landsat系列卫星的分幅规则,并提供WRS的矢量文件下载. WRS,即Worldwide Reference System,是Landsat系列卫星全球影像标记符号系统,用以区分全 ...
- Golang Linux、Windows、Mac 下交叉编译
前言 Golang 支持交叉编译, 即同一份代码,在一个平台上生成,然后可以在另外一个平台去执行. 之前写过一篇 Golang windows下 交叉编译 感觉写的不够全面,这篇作为补充. 交叉编译 ...
- 如何让低于1B参数的小型语言模型实现 100% 的准确率
如何让低于1B参数的小型语言模型实现 100% 的准确率 上下文学习被低估了--ICL 是提升性能的秘密钥匙--教会 AI 说"我不知道"--第 2 部分 Fabio Matric ...
- datasnap的监督功能【3】-TCP链接监督功能
1.对于使用TCP/IP链接的客户端应用程序,是具有状态的.一直等到客户端完成服务请求后释放配置的资源.如何掉线了,那么服务器就是傻傻地等着,可能导致资源耗尽. 如何在服务端选择一个链接切断关闭之: ...
- java开发中简简单单的全局异常处理
今天吃饭时,被公司新来的同事问道:"项目controller层里好多都没写try,catch,难道异常不用处理吗?".虽然正吃饭时被打扰,让我很讨厌,但是既然他诚心诚意的问了,本着 ...
- springboot集成docker实现自动化构建镜像说明
springboot集成docker实现自动化构建镜像说明 文档说明 该文档仅包括通过配置springboot.docker.jenkins.git.appollo等实现持续构建,持续发布的功能,不包 ...
- Postman+Newman生成接口测试报告
1.安装node 安装完后进入cmd输入node检验版本 2.安装newman 打开cmd-->输入npm install -g newman,然后输入newman -v验证版本 3.安装htm ...
- jmeter使用之数据关联