最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

最新評(píng)論

迁西县| 平和县| 泾阳县| 临夏市| 漾濞| 彭州市| 屏边| 平潭县| 清水县| 甘洛县| 三门峡市| 太白县| 铅山县| 灵武市| 密云县| 吴堡县| 绩溪县| 北碚区| 大英县| 丽江市| 治多县| 六枝特区| 容城县| 永春县| 保康县| 呈贡县| 龙岩市| 宝应县| 荔波县| 华安县| 阿瓦提县| 连南| 吉隆县| 柳州市| 马关县| 盐池县| 吴堡县| 枞阳县| 佛山市| 镇坪县| 洛阳市|