ASP.NET?Core?EFCore?屬性配置與DbContext的用法詳解
本文將深入探討 ASP.NET Core 中 EFCore 的實體屬性配置方法及 DbContext 的核心用法,幫助開發(fā)者高效管理數(shù)據(jù)模型與數(shù)據(jù)庫交互。
一、屬性配置
實體屬性配置是定義模型與數(shù)據(jù)庫映射的核心,EFCore 提供兩種方式:數(shù)據(jù)注解和 Fluent API。
1. 數(shù)據(jù)注解(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]:外鍵關(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)勢:
集中管理配置,避免污染實體類。
支持復(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)選項,每個請求一個實例,確保線程安全。
避免長時間持有
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():跟蹤實體狀態(tài)SaveChangesAsync():提交事務(wù)
4. 性能優(yōu)化
AsNoTracking():禁用變更跟蹤,提升查詢速度。
DbContext 池:復(fù)用上下文實例,減少開銷。
services.AddDbContextPool<AppDbContext>(...);
三、高級配置
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. 全局過濾器
自動應(yīng)用查詢條件(如軟刪除):
modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
四、最佳實踐與常見問題
選擇數(shù)據(jù)注解還是 Fluent API?
簡單配置用數(shù)據(jù)注解,復(fù)雜需求用 Fluent API。
DbContext 線程安全
確保每個請求使用獨立實例,避免并發(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í)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
關(guān)于前臺調(diào)用后臺事件__doPostBack函數(shù)
關(guān)于前臺調(diào)用后臺事件__doPostBack函數(shù)...2007-04-04
.Net?Core使用Logger實現(xiàn)log寫入本地文件系統(tǒng)
這篇文章介紹了.Net?Core使用Logger實現(xiàn)log寫入本地文件系統(tǒng)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
visual studio 2015+opencv2.4.13配置教程
這篇文章主要為大家詳細(xì)介紹了visual studio 2015+opencv2.4.13配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
asp.net中如何批量導(dǎo)出access某表內(nèi)容到word文檔
最近有項目需求是這樣的,需要將某表中的每一條記錄中的某些內(nèi)容導(dǎo)出在一個word文檔中。下面小編就把我的解決辦法分享給大家,供大家參考2015-10-10
微信公眾平臺開發(fā)之發(fā)送圖文消息.Net代碼解析
這篇文章主要為大家詳細(xì)解析了微信公眾平臺開發(fā)之發(fā)送圖文消息.Net代碼,感興趣的小伙伴們可以參考一下2016-06-06

