Entity Framework框架

深入理解C#中的Entity Framework框架:從理論到實踐

在C#開發中,與數據庫交互是幾乎所有應用程序的核心需求之一。Entity Framework (EF) 作為微軟官方推出的ORM框架,極大地簡化了數據庫操作。本文將帶您深入理解EF框架的核心概念,并通過詳細代碼示例演示增刪改查(CRUD)操作的完整實現。

一、Entity Framework框架概述

Entity Framework是微軟開發的開源對象關系映射(ORM)框架,它充當了應用程序對象與數據庫之間的橋梁。通過EF,開發者可以使用面向對象的編程方式操作數據庫,而無需直接編寫SQL語句。EF支持兩種主要開發模式:

Code First:先編寫實體類,然后通過遷移生成數據庫表結構
Database First:基于現有數據庫生成實體類

本文將重點演示Code First模式,這是現代開發中更常用的方式。

二、核心概念詳解

1. DbContext

DbContext是EF框架的核心類,代表數據庫會話。它管理所有實體對象的生命周期,并提供與數據庫交互的入口點。每個DbContext實例對應一個數據庫連接

2. DbSet

DbSet代表數據庫中的表,用于執行CRUD操作每個DbSet屬性對應數據庫中的一個表

3. 遷移(Migrations)

遷移是EF框架的數據庫版本控制機制。通過遷移,開發者可以使用C#代碼來更新數據庫結構,保持模型與數據庫同步。

4. 實體類

實體類是與數據庫表對應的POCO(Plain Old CLR Object)類。通過數據注解或Fluent API可以配置實體類與數據庫表的映射關系

三、環境準備與代碼實現

1. 創建項目并安裝NuGet包

首先創建一個新的C#控制臺應用程序,然后通過NuGet包管理器安裝以下包:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design

2. 定義實體類

創建Student.cs文件,定義學生實體類:

using System.ComponentModel.DataAnnotations;public class Student
{[Key]public int StudentId { get; set; }[Required][MaxLength(50)]public string Name { get; set; }public DateTime EnrollmentDate { get; set; }public bool IsActive { get; set; }
}

3. 創建DbContext

創建SchoolContext.cs文件,繼承DbContext

using Microsoft.EntityFrameworkCore;public class SchoolContext : DbContext
{public SchoolContext(DbContextOptions<SchoolContext> options): base(options) { }public DbSet<Student> Students { get; set; }
}

4. 配置連接字符串

appsettings.json中添加數據庫連接字符串:

{"ConnectionStrings": {"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=SchoolDB;Trusted_Connection=True;"}
}

5. 注冊服務

Program.cs注冊DbContext服務

using Microsoft.EntityFrameworkCore;var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");var configuration = builder.Build();builder.Services.AddDbContext<SchoolContext>(options =>options.UseSqlServer(configuration.GetConnectionString("DefaultConnection")));var app = builder.Build();

6. 創建并應用遷移

打開命令行工具,執行以下命令:

dotnet ef migrations add InitialCreate
dotnet ef database update

這將生成初始遷移并更新數據庫創建Students表

四、CRUD操作實現

創建StudentRepository.cs文件,實現CRUD操作:

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading.Tasks;public class StudentRepository
{private readonly SchoolContext _context;public StudentRepository(SchoolContext context)//通過構造方法取出SchoolContext 實例{_context = context;}// 創建學生public async Task CreateAsync(Student student){_context.Students.Add(student);await _context.SaveChangesAsync();}// 獲取所有學生public async Task<List<Student>> GetAllAsync(){return await _context.Students.ToListAsync();}// 根據ID獲取學生public async Task<Student> GetByIdAsync(int id){return await _context.Students.FindAsync(id);}// 更新學生public async Task UpdateAsync(Student student){_context.Entry(student).State = EntityState.Modified;await _context.SaveChangesAsync();}// 刪除學生public async Task DeleteAsync(int id){var student = await _context.Students.FindAsync(id);if (student != null){_context.Students.Remove(student);await _context.SaveChangesAsync();}}
}

五、使用示例

Main方法中演示CRUD操作:

var studentRepository = new StudentRepository(app.Services.GetRequiredService<SchoolContext>());// 創建學生
var newStudent = new Student 
{Name = "張三",EnrollmentDate = DateTime.Now,IsActive = true
};
await studentRepository.CreateAsync(newStudent);// 查詢所有學生
var students = await studentRepository.GetAllAsync();
foreach (var student in students)
{Console.WriteLine($"ID: {student.StudentId}, 姓名: {student.Name}");
}// 更新學生
var studentToUpdate = await studentRepository.GetByIdAsync(1);
if (studentToUpdate != null)
{studentToUpdate.Name = "李四";await studentRepository.UpdateAsync(studentToUpdate);
}// 刪除學生
await studentRepository.DeleteAsync(1);

六、注意事項

異常處理:實際開發中應添加try-catch塊處理數據庫操作異常
依賴注入:推薦使用依賴注入管理DbContext生命周期
數據庫選擇:可根據需要替換為MySQL、PostgreSQL等其他數據庫提供程序
性能優化:對于復雜查詢,建議使用AsNoTracking()提升性能
事務處理:需要事務時可以使用DbContext.Database.BeginTransaction()

七、結語

Entity Framework框架通過其強大的ORM功能,極大地簡化了C#應用程序中的數據庫操作。通過Code First模式,開發者可以更加專注于業務邏輯的實現,而無需關心底層數據庫結構的細節。本文演示了EF框架的基本使用方法,實際項目中可以根據需求添加更多功能如分頁查詢、復雜查詢、緩存機制等。

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

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

相關文章

C++11QT復習 (五)

文章目錄 **Day6-2 成員訪問運算符重載&#xff08;2025.03.25&#xff09;****1. 復習****2. 成員訪問運算符重載****2.1 箭頭運算符 (->) 重載****(1) 語法** **2.2 解引用運算符 (*) 重載****(1) 語法** **3. 代碼分析****3.1 代碼結構****3.2 代碼解析****(1) Data 類**…

簡歷含金量的描述和注意事項!

背景 最近&#xff0c;在公司負責后端相關面試&#xff0c;簡歷看了不下 50 份&#xff0c;面試 10&#xff0c;純手碼 2000 多字&#xff0c;說說我對簡歷的看法&#xff0c;希望給大家一點啟發。 教育經歷 在眾多求職面試中&#xff0c;我發現多數求職者容易忽視教育背景的…

cellnet框架概述

cellnet框架是一個?高性能、組件化、多協議支持?的開源服務器網絡庫&#xff0c;專注于游戲服務器、分布式的多進程通信等場景的開發。 一、核心特性 ?支持多個主流協議&#xff0c;包括TCP、UDP、HTTP、WebSocket。并且抽象底層協議差異&#xff0c;統一網絡連接管理?。 …

【加密社】如何創建自己的幣圈工具站

需要準備的工作 1.域名 2.服務器 周末的時候主要弄了快訊這方面的代碼 我這里用的是星球日報的api&#xff0c;也可以訂閱他們的rss&#xff0c;這部分在github上是開源的 https://github.com/ODAILY 我這里用的是WordPressonenav主題&#xff0c;然后用小工具在主頁展示&am…

Docker學習筆記(十一)宿主機無法鏈接宿主機問題處理

故障排查優先級排序 服務狀態 → 2. 端口監聽 → 3. 防火墻 → 4. 權限配置 → 5. 網絡路由 &#xff08;按此順序可覆蓋95%的常見問題?15&#xff09; mysql鏡像啟動命令&#xff1a; docker run -p 3306:3306 --restartalways --name mysqlv8 -e MYSQL_ROOT_PASSWORDCd…

力扣:回溯算法

組合I class Solution {List<List<Integer>> result new ArrayList(); // 所有結果集List<Integer> list new ArrayList(); // 當前結果集public List<List<Integer>> combine(int n, int k) {dfs(n, k, 1);return result;}public void dfs(i…

華為HCIE鴻蒙應用開發認證靠譜嗎?

在萬物互聯時代&#xff0c;智能終端設備的多樣性與協同需求催生了操作系統的革新。華為HarmonyOS&#xff08;鴻蒙系統&#xff09;憑借其分布式架構與全場景能力&#xff0c;正成為打破設備邊界、重塑用戶體驗的核心技術底座。HCIE鴻蒙應用開發認證作為華為認證體系的頂級資質…

23種設計模式-原型(Prototype)設計模式

原型設計模式 &#x1f6a9;什么是原型設計模式&#xff1f;&#x1f6a9;原型設計模式的特點&#x1f6a9;原型設計模式的結構&#x1f6a9;原型設計模式的優缺點&#x1f6a9;原型設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是原型設計模式…

Oracle-rman restore遭遇RMAN-03002與ORA-19563

文章目錄 在原DB上檢查是否有重復的文件名&#xff1a;查看rman恢復的日志修正重名部分重新執行rman恢復結論&#xff1a; 在 RMAN 恢復過程中&#xff0c;遇到RMAN-03002連同ORA-19563:錯誤。 操作是將 Oracle 10.0.5的數據庫備份從 RMAN備份恢復到另一臺測試主機的同一個目錄…

運維網絡排查工具介紹與使用

作為一名運維工程師&#xff0c;日常工作中最令人頭疼的莫過于各種網絡故障。在過去一年半的運維生涯中&#xff0c;我積累了豐富的網絡故障排查經驗&#xff0c;今天就來和大家分享一下如何運用抓包工具&#xff08;Wireshark、tcpdump&#xff09;和網絡排查工具&#xff08;…

解決vscode終端和本地終端python版本不一致的問題

&#x1f33f; 問題描述 本地終端&#xff1a; vscode終端&#xff1a; 別被這個給騙了&#xff0c;繼續往下看&#xff1a; 難怪我導入一些包的時候老提示找不到&#xff0c;在本地終端就不會這樣&#xff0c;于是我嚴重懷疑vscode中的python版本和終端不一樣&#xff0c…

Sublime全局搜索快捷鍵Ctrl+Shift+F不能使用解決

問題描述&#xff1a; 在安裝好Sublime后&#xff0c;我們使用快捷鍵進行全局搜索&#xff0c;發現沒有反應&#xff0c;但是中文輸入變成了繁體。 解決方案&#xff1a; 如截圖&#xff0c;在關閉簡繁切換的快捷鍵或者換成其他的就行

海康HTTP監聽報警事件數據

http監聽接收報警事件數據 海康獲取設備報警事件數據兩種方式&#xff1a; 1、sdk 布防監聽報警事件數據,服務端布防。&#xff08;前面文章有示例&#xff09; 2、http監聽接收報警事件數據&#xff0c;設備直接推送。 http監聽接收報警事件數據&#xff0c;服務端可以使用n…

Python----計算機視覺處理(Opencv:圖像邊緣檢測:非極大值抑制,雙閾值篩選)

一、 高斯濾波 邊緣檢測本身屬于銳化操作&#xff0c;對噪點比較敏感&#xff0c;所以需要進行平滑處理。這里使用的是一個5*5的高斯 核對圖像進行消除噪聲。 二、計算圖像的梯度和方向 三、非極大值抑制 在得到每個邊緣的方向之后&#xff0c;其實把它們連起來邊緣檢測就算完了…

Maven工具學習使用(四)——倉庫

倉庫分類 對于Mavne來說,倉庫只分為兩類:本地倉庫和遠程倉庫。當Maven根據坐標查詢尋找構件的時候,它首先會查看本地倉庫,如果本地倉庫存在此構件,則直接使用;如果本地倉庫不存在此構件,或者需要查看是否有更新的構件版本,Maven就會去遠程倉庫查找,發現需要的構件之后…

Axure PR 9.0(發音:Ack-sure)原型圖工具入門教程:鏈接交互

文章目錄 引言Axure? RP 9I Axure RP9入門介紹元件庫對兩個元件進行連接頁面:導航視圖、概要母版交互II 鏈接交互從A頁面跳轉到B頁面返回之前的頁面see also引言 【 產品原型圖】核心價值和實際應用場景:可視化需求,統一團隊理解 https://blog.csdn.net/z929118967/articl…

docker遠程debug

1. 修改 Java 啟動命令 在 Docker 容器中啟動 Java 程序時&#xff0c;需要添加 JVM 調試參數&#xff0c;jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本&#xff1a; java -Xdebug -Xrunjdwp:tra…

K8S學習之基礎五十四:jenkins新建測試流水線

jenkins新建測試流水線 新建任務 node(testak) {stage(第1步:從gitee上下載源代碼) {git url: "https://gitee.com/akang007/jenkins-sample"script {build_tag sh(returnStdout: true, script: git rev-parse --short HEAD).trim()}}stage(第2步&#xff1a;基…

SylixOS 中 select 原理及使用分析

1、select接口簡介 1.1 select接口使用用例 select 是操作系統多路 I/O 復用技術實現的方式之一。 select 函數允許程序監視多個文件描述符&#xff0c;等待所監視的一個或者多個文件描述符變為“準備好”的狀態。所謂的”準備好“狀態是指&#xff1a;文件描述符不再是阻塞狀…

Spring WebFlux之ServerWebExchange

ServerWebExchange 是 Spring WebFlux 中的一個核心接口&#xff0c;用于表示服務器端處理的 HTTP 請求和響應。它封裝了請求和響應的所有信息&#xff0c;并提供了相應的方法來操作這些信息。ServerWebExchange 在響應式編程模型中扮演著關鍵角色&#xff0c;支持非阻塞、異步…