本文将深入探讨 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);

四、最佳实践与常见问题

  1. 选择数据注解还是 Fluent API?

    • 简单配置用数据注解,复杂需求用 Fluent API。

  2. DbContext 线程安全

    • 确保每个请求使用独立实例,避免并发问题。

  3. 迁移(Migrations)

    • 通过 dotnet ef migrations add 生成数据库架构变更。

  4. 性能陷阱

    • 避免在循环中频繁调用 SaveChanges()

    • 使用 Include() 预加载关联数据,减少 N+1 查询。


结语

掌握 EFCore 的属性配置与 DbContext 管理,能够显著提升数据层开发效率。合理选择配置方式,结合依赖注入和性能优化技巧,可构建高效稳健的 ASP.NET Core 应用。

ASP.NET Core EFCore 属性配置与DbContext 详解的更多相关文章

  1. ASP.NET Core MVC 源码学习:详解 Action 的激活

    前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...

  2. ASP.NET Core MVC 源码学习:详解 Action 的匹配

    前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...

  3. ASP.NET Core托管运行Quartz.NET作业调度详解

    Quartz.NET这么NB的作业调度系统,不会还行?   今天介绍一下Quartz.NET的托管运行,官网传送门. 一.前言 Quartz.NET,按官网上的说法,是一款功能齐全的任务调度系统,从小 ...

  4. Asp.Net Core 中IdentityServer4 实战之 Claim详解

    一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...

  5. DevExpress ASP.NET Core Controls v18.2新功能详解

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Core ...

  6. springboot快速入门(二)——项目属性配置(日志详解)

    一.概述 application.properties就是springboot的属性配置文件 在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring ...

  7. asp.net中web.config配置节点大全详解

    最近网上找了一些关于Web.config配置节点的文章,发现很多都写的都比较零散,而且很少有说明各个配置节点的作用和用法.搜索了一下发现有一篇写的不错,这里引用一下 原文地址 http://www.c ...

  8. asp.net中web.config配置节点大全详解【转】

    web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所在目录下不存在web ...

  9. ASP.NET Core开发-如何配置Kestrel 网址Urls

    ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls. ...

  10. asp.net core 将配置文件配置迁移到数据库(一)

    asp.net core 将配置文件配置迁移到数据库(一) Intro asp.net core 配置默认是项目根目录下的 appsettings.json 文件,还有环境变量以及 command l ...

随机推荐

  1. Arduino语法--数据类型

    Arduino与C语言类似,有多种数据类型.数据类型在数据结构中的定义是一个值的集合,以及定义在这个值集上的一组操作,各种数据类型需要在特定的地方使用.一般来说,变量的数据类型决定了如何将代表这些值的 ...

  2. STM32中如何使用printf()函数

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 在STM32串口通信程序中使用printf发送数据,非常的方便.可在刚开始使用的时候总是遇到问题,常见的是硬件访 ...

  3. Landsat遥感影像分幅条带介绍与矢量下载:WRS的Path与Row

      本文介绍Landsat系列卫星的分幅规则,并提供WRS的矢量文件下载.   WRS,即Worldwide Reference System,是Landsat系列卫星全球影像标记符号系统,用以区分全 ...

  4. Golang Linux、Windows、Mac 下交叉编译

    前言 Golang 支持交叉编译, 即同一份代码,在一个平台上生成,然后可以在另外一个平台去执行. 之前写过一篇 Golang windows下 交叉编译 感觉写的不够全面,这篇作为补充. 交叉编译 ...

  5. 如何让低于1B参数的小型语言模型实现 100% 的准确率

    如何让低于1B参数的小型语言模型实现 100% 的准确率 上下文学习被低估了--ICL 是提升性能的秘密钥匙--教会 AI 说"我不知道"--第 2 部分 Fabio Matric ...

  6. datasnap的监督功能【3】-TCP链接监督功能

    1.对于使用TCP/IP链接的客户端应用程序,是具有状态的.一直等到客户端完成服务请求后释放配置的资源.如何掉线了,那么服务器就是傻傻地等着,可能导致资源耗尽. 如何在服务端选择一个链接切断关闭之: ...

  7. java开发中简简单单的全局异常处理

    今天吃饭时,被公司新来的同事问道:"项目controller层里好多都没写try,catch,难道异常不用处理吗?".虽然正吃饭时被打扰,让我很讨厌,但是既然他诚心诚意的问了,本着 ...

  8. springboot集成docker实现自动化构建镜像说明

    springboot集成docker实现自动化构建镜像说明 文档说明 该文档仅包括通过配置springboot.docker.jenkins.git.appollo等实现持续构建,持续发布的功能,不包 ...

  9. Postman+Newman生成接口测试报告

    1.安装node 安装完后进入cmd输入node检验版本 2.安装newman 打开cmd-->输入npm install -g newman,然后输入newman -v验证版本 3.安装htm ...

  10. jmeter使用之数据关联