.NET Core 數據庫ORM框架用法簡述

.NET Core ORM框架用法簡述

一、主流.NET Core ORM框架概述

在.NET Core生態系統中,主流的ORM(Object-Relational Mapping)框架包括:

  1. ??Entity Framework Core (EF Core)?? - 微軟官方推出的ORM框架
  2. ??Dapper?? - 輕量級微ORM
  3. ??Npgsql.EntityFrameworkCore.PostgreSQL?? - PostgreSQL專用EF Core提供程序
  4. ??Pomelo.EntityFrameworkCore.MySql?? - MySQL專用EF Core提供程序
  5. ??LINQ to DB?? - 高性能ORM

本文重點介紹最常用的EF Core和Dapper。

二、Entity Framework Core (EF Core) 使用指南

1. 安裝與配置

??安裝NuGet包??:

 
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer # SQL Server提供程序
# 或其他數據庫提供程序

??DbContext配置??:

 
public class AppDbContext : DbContext
{public DbSet<User> Users { get; set; }public DbSet<Order> Orders { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlServer("Server=.;Database=MyApp;Trusted_Connection=True;");}
}

??依賴注入配置??(推薦):

 
// Startup.cs或Program.cs
builder.Services.AddDbContext<AppDbContext>(options =>options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

2. 數據模型定義

??實體類??:

 
public class User
{public int Id { get; set; }public string Name { get; set; }public DateTime BirthDate { get; set; }// 導航屬性public ICollection<Order> Orders { get; set; }
}public class Order
{public int Id { get; set; }public decimal Amount { get; set; }public DateTime OrderDate { get; set; }// 外鍵和導航屬性public int UserId { get; set; }public User User { get; set; }
}

??Fluent API配置??:

 
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<User>().Property(u => u.Name).IsRequired().HasMaxLength(50);modelBuilder.Entity<Order>().HasOne(o => o.User).WithMany(u => u.Orders).HasForeignKey(o => o.UserId);
}

3. CRUD操作

??添加數據??:

 
using (var context = new AppDbContext())
{var user = new User { Name = "張三", BirthDate = new DateTime(1990, 1, 1) };context.Users.Add(user);context.SaveChanges();
}

??查詢數據??:

 
// 簡單查詢
var users = context.Users.ToList();// 條件查詢
var activeUsers = context.Users.Where(u => u.Name.Contains("張")).OrderBy(u => u.BirthDate).ToList();// 投影查詢
var userNames = context.Users.Select(u => new { u.Id, u.Name }).ToList();

??更新數據??:

 
using (var context = new AppDbContext())
{var user = context.Users.Find(1);if (user != null){user.Name = "李四";context.SaveChanges();}
}

??刪除數據??:

 
using (var context = new AppDbContext())
{var user = context.Users.Find(1);if (user != null){context.Users.Remove(user);context.SaveChanges();}
}

4. 高級功能

??異步操作??:

 
var user = await context.Users.FindAsync(1);
var users = await context.Users.Where(u => u.Name.Contains("張")).ToListAsync();

??事務處理??:

 
using (var transaction = await context.Database.BeginTransactionAsync())
{try{// 執行多個操作await context.SaveChangesAsync();await transaction.CommitAsync();}catch{await transaction.RollbackAsync();throw;}
}

??遷移管理??:

 
# 添加遷移
dotnet ef migrations add InitialCreate# 更新數據庫
dotnet ef database update# 回滾遷移
dotnet ef database update PreviousMigration

三、Dapper使用指南

1. 安裝與配置

??安裝NuGet包??:

 
dotnet add package Dapper
dotnet add package System.Data.SqlClient # SQL Server提供程序

??基本使用??:

 
using var connection = new SqlConnection("Server=.;Database=MyApp;Trusted_Connection=True;");
connection.Open();

2. CRUD操作

??查詢數據??:

 
var users = connection.Query<User>("SELECT * FROM Users WHERE Name LIKE @Name", new { Name = "%張%" });var user = connection.QueryFirstOrDefault<User>("SELECT * FROM Users WHERE Id = @Id", new { Id = 1 });

??插入數據??:

 
var id = connection.QuerySingle<int>("INSERT INTO Users (Name, BirthDate) VALUES (@Name, @BirthDate); SELECT SCOPE_IDENTITY();",new { Name = "張三", BirthDate = DateTime.Now });

??更新數據??:

 
var affectedRows = connection.Execute("UPDATE Users SET Name = @Name WHERE Id = @Id",new { Name = "李四", Id = 1 });

??刪除數據??:

 
var deletedRows = connection.Execute("DELETE FROM Users WHERE Id = @Id", new { Id = 1 });

3. 高級功能

??存儲過程調用??:

 
var users = connection.Query<User>("dbo.GetUsersByAgeRange", new { MinAge = 18, MaxAge = 30 },commandType: CommandType.StoredProcedure);

??多結果集處理??:

 
using (var multi = connection.QueryMultiple("SELECT * FROM Users; SELECT * FROM Orders", commandType: CommandType.Text))
{var users = multi.Read<User>().ToList();var orders = multi.Read<Order>().ToList();
}

??動態參數??:

 
var sql = "SELECT * FROM Users WHERE 1=1";
var parameters = new DynamicParameters();
if (!string.IsNullOrEmpty(name))
{sql += " AND Name = @Name";parameters.Add("Name", name);
}
if (minAge.HasValue)
{sql += " AND Age >= @MinAge";parameters.Add("MinAge", minAge.Value);
}var users = connection.Query<User>(sql, parameters);

四、EF Core與Dapper對比

特性EF CoreDapper
??性能??中等(有ORM開銷)高(接近原生SQL)
??學習曲線??較陡峭(需理解LINQ、EF概念)平緩(SQL知識即可)
??功能豐富度??高(遷移、跟蹤、變更檢測等)低(僅數據訪問)
??適用場景??復雜業務、快速開發高性能需求、復雜SQL
??異步支持??原生支持需手動實現
??事務管理??內置支持需手動實現
??緩存??一級緩存無內置緩存

五、選擇建議

  1. ??選擇EF Core當??:

    • 需要快速開發CRUD應用
    • 團隊熟悉ORM概念
    • 需要數據庫遷移功能
    • 項目需要頻繁變更數據模型
  2. ??選擇Dapper當??:

    • 需要極致性能
    • 執行復雜SQL查詢
    • 已有成熟的SQL知識
    • 項目以讀為主,寫操作較少

六、最佳實踐

EF Core最佳實踐

  1. ??合理使用延遲加載??:

     
    // 禁用延遲加載(推薦)
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {optionsBuilder.UseLazyLoadingProxies(false);
    }
  2. ??批量操作優化??:

    // 使用AddRange代替多個Add
    context.Users.AddRange(usersList);// 對于大量數據,考慮分批處理
    foreach (var batch in usersList.Batch(500))
    {context.Users.AddRange(batch);context.SaveChanges();
    }
  3. ??避免N+1查詢??:

    // 不好的做法(會導致N+1)
    var users = context.Users.ToList();
    foreach (var user in users)
    {var orders = context.Orders.Where(o => o.UserId == user.Id).ToList();
    }// 好的做法(預加載)
    var users = context.Users.Include(u => u.Orders).ToList();

Dapper最佳實踐

  1. ??使用參數化查詢??:

     
    // 安全的方式
    connection.Query<User>("SELECT * FROM Users WHERE Name = @Name", new { Name = userInput });// 避免拼接SQL字符串(有SQL注入風險)
    // connection.Query<User>($"SELECT * FROM Users WHERE Name = '{userInput}'");
  2. ??連接管理??:

     
    // 使用using確保連接釋放
    using (var connection = new SqlConnection(connectionString))
    {connection.Open();// 執行操作
    }
  3. ??存儲過程調用??:

     
    var result = connection.QueryFirstOrDefault<int>("dbo.GetUserCountByRole",new { RoleId = roleId },commandType: CommandType.StoredProcedure);

七、性能優化技巧

EF Core性能優化

  1. ??啟用查詢緩存??:

    services.AddDbContext<AppDbContext>(options =>options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking).UseSqlServer(connectionString));
  2. ??使用AsNoTracking??:

    // 只讀場景使用
    var users = context.Users.AsNoTracking().ToList();
  3. ??投影查詢??:

    // 只查詢需要的字段
    var userDtos = context.Users.Select(u => new UserDto { Id = u.Id, Name = u.Name }).ToList();

Dapper性能優化

  1. ??使用ExecuteScalar代替QueryFirstOrDefault??:

    // 獲取單個值
    var count = connection.ExecuteScalar<int>("SELECT COUNT(*) FROM Users");
  2. ??使用動態類型??:

    // 當不需要強類型時
    var result = connection.Query("SELECT * FROM Users").FirstOrDefault();
  3. ??連接池配置??:

    // 在連接字符串中配置
    "Server=.;Database=MyApp;User Id=user;Password=pass;Max Pool Size=100;"

八、常見問題解決

EF Core常見問題

  1. ??N+1查詢問題??:

    • 使用IncludeThenInclude預加載
    • 使用Select投影查詢
  2. ??性能下降??:

    • 檢查生成的SQL(使用日志)
    • 考慮禁用變更跟蹤(AsNoTracking)
    • 優化數據庫索引
  3. ??遷移沖突??:

    • 使用dotnet ef migrations remove回滾
    • 手動合并遷移文件

Dapper常見問題

  1. ??SQL注入風險??:

    • 始終使用參數化查詢
    • 避免字符串拼接SQL
  2. ??連接泄漏??:

    • 確保使用using語句
    • 實現IDisposable模式管理連接
  3. ??結果映射錯誤??:

    • 檢查列名與屬性名匹配
    • 使用Query<T>時確保T有默認構造函數

九、工具與擴展

EF Core工具

  1. ??EF Core Power Tools??:

    • 可視化查看數據庫模型
    • 快速生成實體類
    • 執行數據庫比較
  2. ??Entity Framework Core Profiler??:

    • 分析EF Core生成的SQL
    • 性能監控

Dapper擴展

  1. ??Dapper.Contrib??:

    • 添加簡單的CRUD擴展方法
    connection.Insert(user);
    connection.Update(user);
  2. ??Dapper.FluentMap??:

    • 配置實體到表的映射
    FluentMapper.Initialize(config =>
    {config.AddMap(new UserMap());
    });
  3. ??DapperQueryBuilder??:

    • 構建安全動態SQL
    var query = connection.QueryBuilder($"SELECT * FROM Users WHERE 1=1");
    if (name != null) query.Where("Name = @Name", new { Name = name });
    var users = query.Query<User>();

十、總結與建議

  1. ??EF Core適合??:

    • 快速開發的企業應用
    • 需要數據庫遷移的項目
    • 團隊熟悉ORM的情況
  2. ??Dapper適合??:

    • 高性能要求的微服務
    • 復雜SQL查詢場景
    • 已有成熟SQL知識的項目
  3. ??混合使用策略??:

    • 主框架使用EF Core
    • 性能關鍵部分使用Dapper
    // 在EF Core項目中使用Dapper
    public class UserRepository : IUserRepository
    {private readonly AppDbContext _context;private readonly IDbConnection _dapperConnection;public UserRepository(AppDbContext context, IDbConnection dapperConnection){_context = context;_dapperConnection = dapperConnection;}public User GetById(int id){// 使用EF Corereturn _context.Users.Find(id);}public IEnumerable<User> GetActiveUsers(){// 使用Dapper執行復雜查詢return _dapperConnection.Query<User>("SELECT * FROM Users WHERE IsActive = 1");}
    }

通過合理選擇ORM框架并遵循最佳實踐,可以顯著提高.NET Core應用程序的開發效率和性能表現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81078.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

halcon打開圖形窗口

1、dev_open_window 參數如下&#xff1a; 1&#xff09;Row(輸入參數) y方向上&#xff0c;圖形窗口距離左上角頂端的像素個數 2&#xff09;Column(輸入參數) x方向上&#xff0c;距離左上角左邊的像素個數 3&#xff09;Width(輸入參數) 圖形窗口寬度 4&#xff09;He…

2025東三省D題深圳杯D題數學建模挑戰賽數模思路代碼文章教學

完整內容請看文章最下面的推廣群 一、問題一&#xff1a;混合STR圖譜中貢獻者人數判定 問題解析 給定混合STR圖譜&#xff0c;識別其中的真實貢獻者人數是后續基因型分離與個體識別的前提。圖譜中每個位點最多應出現2n個峰&#xff08;n為人數&#xff09;&#xff0c;但由…

iView Table 組件跨頁選擇功能實現文檔

iView Table 組件跨頁選擇功能實現文檔 功能概述 實現基于 iView Table 組件的多選功能&#xff0c;支持以下特性&#xff1a; ? 跨頁數據持久化選擇? 當前頁全選/取消全選? 自動同步選中狀態顯示? 分頁切換狀態保持? 高性能大數據量支持 實現方案 技術棧 iView UI 4…

家庭服務器IPV6搭建無限郵箱系統指南

qq郵箱操作 // 郵箱配置信息 // 注意&#xff1a;使用QQ郵箱需要先開啟IMAP服務并獲取授權碼 // 設置方法&#xff1a;登錄QQ郵箱 -> 設置 -> 賬戶 -> 開啟IMAP/SMTP服務 -> 生成授權碼 服務器操作 fetchmail 同步QQ郵箱 nginx搭建web顯示本地同步過來的郵箱 ssh…

Tauri v1 與 v2 配置對比

本文檔對比 Tauri v1 和 v2 版本的配置結構和內容差異&#xff0c;幫助開發者了解版本變更并進行遷移。 配置結構變化 v1 配置結構 {"package": { ... },"tauri": { "allowlist": { ... },"bundle": { ... },"security":…

對js的Date二次封裝,繼承了原Date的所有方法,增加了自己擴展的方法,可以實現任意時間往前往后推算多少小時、多少天、多少周、多少月;

封裝js時間工具 概述 該方法繼承了 js 中 Date的所有方法&#xff1b;同時擴展了一部分自用方法&#xff1a; 1、任意時間 往前推多少小時&#xff0c;天&#xff0c;月&#xff0c;周&#xff1b;參數1、2必填&#xff0c;參數3可選beforeDate(num,formatter,dateVal); befo…

TimeDistill:通過跨架構蒸餾的MLP高效長期時間序列預測

原文地址&#xff1a;https://arxiv.org/abs/2502.15016 發表會議&#xff1a;暫定&#xff08;但是Star很高&#xff09; 代碼地址&#xff1a;無 作者&#xff1a;Juntong Ni &#xff08;倪浚桐&#xff09;, Zewen Liu &#xff08;劉澤文&#xff09;, Shiyu Wang&…

DeepSeek最新大模型發布-DeepSeek-Prover-V2-671B

2025 年 4 月 30 日&#xff0c;DeepSeek 開源了新模型 DeepSeek-Prover-V2-671B&#xff0c;該模型聚焦數學定理證明任務&#xff0c;基于混合專家架構&#xff0c;使用 Lean 4 框架進行形式化推理訓練&#xff0c;參數規模達 6710 億&#xff0c;結合強化學習與大規模合成數據…

如何用AI生成假期旅行照?

以下是2025年最新AI生成假期旅行照片的實用工具推薦及使用指南&#xff0c;結合工具特點、研發背景和適用場景進行綜合解析&#xff1a; 一、主流AI旅行照片生成工具推薦與對比 1. 搜狐簡單AI&#xff08;國內工具&#xff09; ? 特點&#xff1a; ? 一鍵優化與背景替換&…

ElaticSearch

ElaticSearch: 全文搜索 超級強&#xff0c;比如模糊查詢、關鍵詞高亮等 海量數據 高效查詢&#xff0c;比傳統關系數據庫快得多&#xff08;尤其是搜索&#xff09; 靈活的數據結構&#xff08;Schema靈活&#xff0c;可以動態字段&#xff09; 分布式高可用&#xff0c;天…

Android開發,實現一個簡約又好看的登錄頁

文章目錄 1. 編寫布局文件2.設計要點說明3. 效果圖4. 關于作者其它項目視頻教程介紹 1. 編寫布局文件 編寫activity.login.xml 布局文件 <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android…

機器學習:【拋擲硬幣的貝葉斯后驗概率】

首先,拋硬幣的問題通常涉及先驗概率、似然函數和后驗概率。假設用戶可能想通過觀察一系列的正面(H)和反面(T)來更新硬幣的偏差概率。例如,先驗可能假設硬幣是均勻的,但隨著觀察到更多數據,用貝葉斯定理計算后驗分布。 通常,硬幣的偏差可以用Beta分布作為先驗,因為它…

Echarts 問題:自定義的 legend 點擊后消失,格式化 legend 的隱藏文本樣式

文章目錄 問題分析實現步驟代碼解釋問題 如下圖所示,在自定義的 legend 點擊后會消失 分析 我把隱藏的圖例字體顏色設為灰色,可以借助 legend.formatter 和 legend.textStyle 結合 option.series 的 show 屬性來達成。以下是具體的實現步驟和示例代碼: <!DOCTYPE ht…

光譜相機如何提升目標檢測與識別精度

光譜相機&#xff08;多光譜/高光譜&#xff09;通過捕捉目標在多個波段的光譜特征&#xff0c;能夠揭示傳統RGB相機無法感知的材質、化學成分及物理特性差異。以下是提升其目標檢測與識別精度的核心方法&#xff1a; ?1. 硬件優化&#xff1a;提升數據質量? ?(1) 光譜分辨…

springboot項目配置nacos,指定使用環境

遇到這樣一個問題&#xff0c;在開發、測試、生成環境之間切換的問題。 大多數的操作是通過修改spring.profiles.active來確定指向使用的環境配置文件&#xff0c;對應項目中需要增加對應的配置文件。 但是現在幾乎所有公司都會有代碼管理不管是SVN、git&#xff0c;這樣就會涉…

AI代碼審查的落地實施方案 - Java架構師面試實戰

AI代碼審查的落地實施方案 - Java架構師面試實戰 本文通過模擬一位擁有十年Java研發經驗的資深架構師馬架構與面試官之間的對話&#xff0c;深入探討了AI代碼審查的落地實施方案。 第一輪提問 面試官&#xff1a; 馬架構&#xff0c;請介紹一下您對AI代碼審查的理解。 馬架…

TDengine 訂閱不到數據問題排查

簡介 TDengine 在實際生產應用中&#xff0c;經常會遇到訂閱程序訂閱不到數據的問題&#xff0c;總結大部分都為使用不當或狀態不正確等問題&#xff0c;需手工解決。 查看服務端狀態 通過 sql 命令查看有問題的 topic 和consumer_group 組訂閱是否正常。 select * from inf…

二、UI自動化測試02--元素定位方法

目錄 一、定位?組元素?法二、XPath 定位?法1. 路徑策略1.1 路徑值獲取?法 2. 利?元素屬性策略利?元素屬性策略的注意事項 3. 屬性和邏輯結合4. 層級和屬性結合策略5. XPath 延伸?法 三、CSS 定位?法1. CSS 策略: id選擇器/class選擇器/元素選擇器/屬性選擇器2. 屬性選擇…

HotSpot的算法細節

可達性分析算法 以一系列“GC Roots”根對象作為起始節點集&#xff0c;從這些節點開始&#xff0c;根據引用關系向下搜索&#xff0c;搜索過程所走過的路徑稱為“引用鏈”&#xff08;Reference Chain&#xff09;&#xff0c;如果某個對象到GC Roots間沒有任何引用鏈相連&am…