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

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)文章

最新評論

贞丰县| 体育| 阿拉善右旗| 磐安县| 阆中市| 彭阳县| 南康市| 调兵山市| 永川市| 仁布县| 五莲县| 平陆县| 溆浦县| 无锡市| 渝中区| 内乡县| 察哈| 青海省| 揭东县| 马公市| 金坛市| 元谋县| 莱阳市| 西安市| 民乐县| 固镇县| 溧阳市| 军事| 镇宁| 沙湾县| 梅河口市| 开封县| 明光市| 农安县| 西宁市| 贺兰县| 绵阳市| 竹山县| 汪清县| 吴忠市| 凤阳县|