本文将深入探讨 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. vue打印浏览器页面功能的两种实现方法

    目录 方法一:通过npm 安装插件 方法二:手动下载插件到本地 总结 推荐使用方法二 方法一:通过npm 安装插件 1,安装 npm install vue-print-nb --save 2,引入 ...

  2. 光猫路由器设置-改桥接、开启UPNP和DMZ的教程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 以电信光猫举例,其他网络百度都有对应教程. 电信光猫 ...

  3. Ansible - [02] 基础配置以及常用操作场景

    Ansible 基础配置 主配置文件:/etc/ansible/ansible.cfg ansible配置文件查找顺序 首先检测ANSIBLE_CONFIG变量定义的配置 其次检查当前目录下的./an ...

  4. Scala查看源码

    package com.wyh.day01 /** * 1.代码格式化的快捷键 ctrl+alt+L\ * 2.scala查看源代码的快捷键 ctrl+b */ object ScalaLookSou ...

  5. Chrome 133 里程碑式更新 - moveBefore, 或开启前端框架未来新纪元?

    相关背景: Chrome 133 版本(将于 2 月 4 日发布稳定版)引入了一个新的 DOM 操作方法:Node.prototype.moveBefore.这一方法虽然看似简单,但其意义重大,因为它 ...

  6. AI 插件第二弹,更强更好用

    概述 插件大更新 前一周, 我们开源了一个 AI 插件,发了一篇介绍的文章 DeepSeek 插件开源上线!支持多家云服务,一键解锁满血版 AI 引来了一些小小的反响,也有用户在评论区或者私底下提了一 ...

  7. 写一个简单的SQL生成工具

    知识点: MyBatis 语法概览 MyBatis 是一个强大的数据持久化框架,它提供了一种半自动化的 ORM 实现方式.通过 MyBatis,开发者可以通过简单的 XML 或注解来配置和映射原生信息 ...

  8. wordpress无法显示gitee图床的图片

    wordpress无法显示gitee图床的图片 Question:如题 Solution:是防盗链的问题,gitee官网给出了防盗链的方法,而github貌似没有. Reference:你已经是个成熟 ...

  9. [tldr]通过指令获取github仓库的单个文件的内容

    针对一个公开的github仓库,有些时候不需要clone整个仓库的内容,只需要对应的几个文件.但是直接通过网页点击下载文件很麻烦,在服务器上也不好这样操作. 因此,如何使用curl或者wget指令快速 ...

  10. IM服务器:一个使用imserver服务器进行聊天的web端案例

    该案例中包含一个基于web网页的前端程序,该案例会使用websocket与IM服务器(imserver)进行通信. 一.环境准备 1.下载 "imserver网页调用案例",并解压 ...