欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET?Core?EFCore?屬性配置與DbContext的用法詳解

 更新時間:2025年05月17日 08:54:46   作者:CSharp精選營  
實體屬性配置是定義模型與數(shù)據(jù)庫映射的核心,EFCore 提供兩種方式:數(shù)據(jù)注解和?Fluent API,本文將深入探討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)文章

  • ASP.NET mvc異常處理的方法示例介紹

    ASP.NET mvc異常處理的方法示例介紹

    這篇文章主要介紹了ASP.NET mvc異常處理的方法,需要的朋友可以參考下
    2014-04-04
  • ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程

    ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程

    這篇文章主要介紹了ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程,詳細(xì)介紹了發(fā)布過程遇到的問題及解決方法,對ASP.NET Core 發(fā)布到IIS相關(guān)知識感興趣的朋友一起看看吧
    2023-01-01
  • ASP.NET Core SignalR中的流式傳輸深入講解

    ASP.NET Core SignalR中的流式傳輸深入講解

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core SignalR中流式傳輸?shù)南嚓P(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 淺析DataBinder.Eval和Eval的區(qū)別

    淺析DataBinder.Eval和Eval的區(qū)別

    縮短的Eval語法與DataBinder.Eval的不同點在于,Eval會根據(jù)最近的容器對象(例如DataListItem)的DataItem屬性來自動地解析字段,而DataBinder.Eval需要使用參數(shù)來指定容器
    2013-08-08
  • ASP.NET中Cookie的用法實例分析

    ASP.NET中Cookie的用法實例分析

    這篇文章主要介紹了ASP.NET中Cookie的用法,實例分析了在asp.net中針對cookie的設(shè)置、添加及讀取等常用操作技巧,非常簡單實用,需要的朋友可以參考下
    2015-08-08
  • IIS7偽靜態(tài)web.config配置的方法和規(guī)則

    IIS7偽靜態(tài)web.config配置的方法和規(guī)則

    本文主要介紹IIS7上配置偽靜態(tài)的超簡單的新方法,安裝URLRewrite插件,配置web.config即可。
    2016-04-04
  • 詳解ASP.NET Core 之 Identity 入門(二)

    詳解ASP.NET Core 之 Identity 入門(二)

    本篇文章主要介紹了ASP.NET Core 之 Identity 入門,主要負(fù)責(zé)對用戶的身份進行認(rèn)證,有興趣的可以了解一下。
    2016-12-12
  • ASP.NET MVC基礎(chǔ)

    ASP.NET MVC基礎(chǔ)

    這篇文章主要介紹了ASP.NET MVC基礎(chǔ)概念、MVC三大組件之間的相互關(guān)系、以及asp.net webform模型和ASP.NET MVC模型的關(guān)系等基礎(chǔ)知識,是我們學(xué)習(xí)MVC必不可少的知識點,希望對大家能有所幫助
    2014-10-10
  • 如何利用FluentMigrator實現(xiàn)數(shù)據(jù)庫遷移

    如何利用FluentMigrator實現(xiàn)數(shù)據(jù)庫遷移

    這篇文章主要給大家介紹了關(guān)于如何利用FluentMigrator實現(xiàn)數(shù)據(jù)庫遷移的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 為WPF框架Prism注冊Nlog日志服務(wù)

    為WPF框架Prism注冊Nlog日志服務(wù)

    這篇文章介紹了為WPF框架Prism注冊Nlog日志服務(wù)的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02

最新評論