一、概述
Entity Framework(實體框架)是一個ORM(對象關係映射)框架,它允許開發人員通過將業務對象映射到數據庫中的表,來實現對數據庫進行操作。它是一個開源框架,由Microsoft維護和開發。Entity Framework不僅提供了數據訪問的解決方案,還支持LINQ(語言集成查詢)等功能,使得編寫數據庫訪問代碼變得更加簡單和直接。
二、基礎操作
使用Entity Framework來操作數據庫,需要進行以下基本步驟:
1、創建一個繼承自DbContext的類,並提供數據庫連接字符串。DbContext是應用程序和數據庫之間交換數據的主要類。它表示一個特定數據庫的上下文。
下面是一個簡單的DbContext的示例:
public class MyDbContext : DbContext
{
public MyDbContext() : base("name=MyConnectionString")
{
}
public DbSet Categories { get; set; }
public DbSet Products { get; set; }
}
2、創建模型。模型是可持久化數據的實體類。它們映射到數據庫的表,在模型中定義的屬性則對應於表中的列,為每個模型類設置主鍵是必選的。
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
//省略其它屬性
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
3、執行CRUD操作。數據庫的增刪改查操作可以通過DbContext來實現。以查詢為例,下面是一個使用LINQ進行查詢並返回結果的示例:
using (var context = new MyDbContext())
{
var products = from p in context.Products
where p.CategoryId == 1
select p;
foreach (var product in products)
{
Console.WriteLine(product.Name);
}
}
三、數據遷移
數據遷移是指修改實體類及其屬性,從而對數據庫架構進行更改。它允許開發人員在不刪除數據庫並保持數據完整性的同時,對應用程序和數據庫架構進行升級。
1、安裝Entity Framework遷移工具。在NuGet包管理器控制台中,執行以下命令:
Install-Package EntityFramework
Install-Package EntityFramework.Tools
2、創建遷移腳本。在終端輸入以下命令:
dotnet ef migrations add <migration name>
其中,<migration name>是自定義的遷移腳本名稱。這個命令會將所有與上一個遷移腳本不同的模型更改寫入新的遷移腳本中,並將其應用於數據庫。
3、通過遷移腳本更新數據庫。在終端輸入以下命令:
dotnet ef database update
四、分頁技巧
分頁是常見的需求,以下是一些常見的分頁技巧:
1、使用Skip()和Take()方法。Skip()和Take()方法允許在從數據庫檢索和處理結果之前跳過一些行,並限制返回的行數。下面是一個簡單的示例,該示例從數據庫中返回第11-20行的數據:
int pageSize = 10;
int pageNumber = 2;
var query = context.Products.OrderBy(p => p.Name)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToList();
2、使用HasNextPage和HasPreviousPage屬性統計物品頁數。以下是一個示例方法,該方法接受當前頁碼、每頁的元素數和總記錄數,並將總頁數、下一頁和上一頁標誌作為out參數輸出:
public static void CalculatePageInfo(int currentPage, int itemsPerPage, int totalItems, out int totalPages, out bool hasNextPage, out bool hasPreviousPage)
{
totalPages = totalItems / itemsPerPage;
if (totalItems % itemsPerPage != 0)
{
totalPages++; // 如果有餘數,則增加一頁
}
hasNextPage = (currentPage 1);
}
五、存儲過程和函數
Entity Framework也支持存儲過程和函數。以下是一些例子:
1、使用SqlQuery方法調用存儲過程。SqlQuery方法允許執行任意的SQL語句,下面是一個簡單的存儲過程示例:
var categoryId = new SqlParameter("@categoryId", 1); // 存儲過程需要參數categoryId
var products = context.Database.SqlQuery<Product>("EXEC GetProductsByCategoryId @categoryId", categoryId).ToList();
2、使用FunctionAttribute屬性和In/Out/Return等修飾符聲明函數。以下是一個簡單的函數示例,該函數可以接受輸入參數和返回值:
[DbFunction("MyNamespace", "MyScalarFunction")]
public static int MyScalarFunction(int input)
{
throw new NotSupportedException(); // 空實現,因為我們不應該在代碼中調用函數,而應該將其用在LINQ表達式中
}
然後,可以將它添加到LINQ查詢中:
var query = from p in context.Products
select new
{
Id = p.Id,
Name = p.Name,
CategoryId = p.CategoryId,
CategoryName = MyScalarFunction(p.CategoryId) // 使用MyScalarFunction
};
六、並發控制
在多個線程和進程同時訪問數據庫時,可能會發生並發更新。為了解決這個問題,Entity Framework支持樂觀並發控制和悲觀並發控制。
1、樂觀並發控制。樂觀並發控制假定在任何給定時間,每個實體都具有獨立的版本,並且在保存實體時進行檢查。如果實體版本與數據庫中的版本不匹配,則表示實體已被其他用戶更新並拋出異常。
var product = context.Products.Find(id);
product.Name = "NewName";
try
{
context.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
// 必須獲取數據庫中的實體以更新本地緩存
ex.Entries.Single().Reload();
}
2、悲觀並發控制。悲觀並發控制使用鎖定機制,在對實體進行修改時阻止其他會話的訪問。以下是一個示例,使用SELECT FOR UPDATE語句將數據行鎖定:
using (var context = new MyDbContext())
{
using (var dbContextTransaction = context.Database.BeginTransaction())
{
try
{
var product = context.Products.SqlQuery("SELECT * FROM dbo.Products WITH (UPDLOCK, ROWLOCK) WHERE Id = @id", new SqlParameter("@id", id)).Single();
product.Name = "NewName";
context.SaveChanges();
dbContextTransaction.Commit();
}
catch (Exception ex)
{
dbContextTransaction.Rollback();
}
}
}
七、總結
Entity Framework提供了一種簡單的方法來訪問和操作數據庫。從基礎操作、數據遷移、分頁技巧、存儲過程和函數以及並發控制等方面,本文介紹了Entity Framework的常見用法,並提供了代碼示例。使用Entity Framework時,請考慮數據量和性能問題,並選擇最適合自己的實現方式。
原創文章,作者:RKSY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131113.html