ASP.NET?Core?EFCore?屬性配置與DbContext的用法詳解
本文將深入探討 ASP.NET Core 中 EFCore 的實(shí)體屬性配置方法及 DbContext 的核心用法,幫助開發(fā)者高效管理數(shù)據(jù)模型與數(shù)據(jù)庫交互。
一、屬性配置
實(shí)體屬性配置是定義模型與數(shù)據(jù)庫映射的核心,EFCore 提供兩種方式:數(shù)據(jù)注解和 Fluent API。
1. 數(shù)據(jù)注解(Data Annotations)
通過特性(Attributes)直接在實(shí)體類上聲明配置,適合簡單場景。
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]:外鍵關(guān)系[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) // 一對一/多關(guān)系
.WithMany(c => c.Products)
.HasForeignKey(p => p.CategoryId);
});}常用配置方法:
HasKey():定義主鍵Property().IsRequired():非空約束HasIndex():創(chuàng)建索引HasOne().WithMany():配置導(dǎo)航關(guān)系
優(yōu)勢:
集中管理配置,避免污染實(shí)體類。
支持復(fù)雜配置(如復(fù)合主鍵、繼承映射)。
二、DbContext 詳解
DbContext 是 EFCore 的核心,負(fù)責(zé)數(shù)據(jù)庫連接、查詢、事務(wù)管理等。
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):默認(rèn)選項(xiàng),每個(gè)請求一個(gè)實(shí)例,確保線程安全。
避免長時(shí)間持有
DbContext,以防內(nèi)存泄漏。
3. 數(shù)據(jù)操作
查詢:
var products = await _context.Products.Where(p => p.Price > 50).ToListAsync();
保存變更:
_context.Products.Add(newProduct); await _context.SaveChangesAsync();
關(guān)鍵方法:
Add(),Remove():跟蹤實(shí)體狀態(tài)SaveChangesAsync():提交事務(wù)
4. 性能優(yōu)化
AsNoTracking():禁用變更跟蹤,提升查詢速度。
DbContext 池:復(fù)用上下文實(shí)例,減少開銷。
services.AddDbContextPool<AppDbContext>(...);
三、高級(jí)配置
1. 多對多關(guān)系
使用 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. 全局過濾器
自動(dòng)應(yīng)用查詢條件(如軟刪除):
modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
四、最佳實(shí)踐與常見問題
選擇數(shù)據(jù)注解還是 Fluent API?
簡單配置用數(shù)據(jù)注解,復(fù)雜需求用 Fluent API。
DbContext 線程安全
確保每個(gè)請求使用獨(dú)立實(shí)例,避免并發(fā)問題。
遷移(Migrations)
通過
dotnet ef migrations add生成數(shù)據(jù)庫架構(gòu)變更。
性能陷阱
避免在循環(huán)中頻繁調(diào)用
SaveChanges()。使用
Include()預(yù)加載關(guān)聯(lián)數(shù)據(jù),減少 N+1 查詢。
結(jié)語
掌握 EFCore 的屬性配置與 DbContext 管理,能夠顯著提升數(shù)據(jù)層開發(fā)效率。合理選擇配置方式,結(jié)合依賴注入和性能優(yōu)化技巧,可構(gòu)建高效穩(wěn)健的 ASP.NET Core 應(yīng)用。
到此這篇關(guān)于ASP.NET Core EFCore 屬性配置與DbContext 詳解的文章就介紹到這了,更多相關(guān)ASP.NET Core EFCore 屬性配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DotNetCore深入了解之HttpClientFactory類詳解
這篇文章主要給大家介紹了關(guān)于DotNetCore深入了解之HttpClientFactory類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
關(guān)于前臺(tái)調(diào)用后臺(tái)事件__doPostBack函數(shù)
關(guān)于前臺(tái)調(diào)用后臺(tái)事件__doPostBack函數(shù)...2007-04-04
.Net?Core使用Logger實(shí)現(xiàn)log寫入本地文件系統(tǒng)
這篇文章介紹了.Net?Core使用Logger實(shí)現(xiàn)log寫入本地文件系統(tǒng)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
WPF項(xiàng)目在設(shè)計(jì)界面調(diào)用后臺(tái)代碼
這篇文章介紹了WPF項(xiàng)目在設(shè)計(jì)界面調(diào)用后臺(tái)代碼的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
.net中自定義錯(cuò)誤頁面的實(shí)現(xiàn)升級(jí)篇
這篇文章主要給大家介紹了關(guān)于.net中自定義錯(cuò)誤頁面實(shí)現(xiàn)的相關(guān)資料,這篇文章是之前的升級(jí)篇,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
visual studio 2015+opencv2.4.13配置教程
這篇文章主要為大家詳細(xì)介紹了visual studio 2015+opencv2.4.13配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
asp.net中如何批量導(dǎo)出access某表內(nèi)容到word文檔
最近有項(xiàng)目需求是這樣的,需要將某表中的每一條記錄中的某些內(nèi)容導(dǎo)出在一個(gè)word文檔中。下面小編就把我的解決辦法分享給大家,供大家參考2015-10-10
ASP.NET 獲取存儲(chǔ)過程返回值的實(shí)現(xiàn)代碼
ASP.NET 獲取存儲(chǔ)過程返回值的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-12-12
微信公眾平臺(tái)開發(fā)之發(fā)送圖文消息.Net代碼解析
這篇文章主要為大家詳細(xì)解析了微信公眾平臺(tái)開發(fā)之發(fā)送圖文消息.Net代碼,感興趣的小伙伴們可以參考一下2016-06-06

