目錄
簡介
-
本EF擴展插件將持續更新:開源,敏捷,高性能。(由於EF Core暫未提供方便的鈎子位置,暫無EF Core版本)
-
EntityFramework.Extension代碼 (GitHub歡迎Fork)
-
EntityFramework.Extension代碼 (Nuget:Install-Package EntityFramework.Extension)
讀寫分離
讀寫分離,支持可配置項的方式。同時支持權重的方式輪詢。
- 先看段配置文件
<entityFrameworkConfig isSlaveRead="true" readConnstr="Data Source=(localdb)\test;Initial Catalog=Demo;Integrated Security=True;">
<slaves>
<add name="test1" connectionString="Data Source=(localdb)\test;Initial Catalog=Demo;Integrated Security=True;" weight="1"/>
<add name="test2" connectionString="Data Source=(localdb)\test;Initial Catalog=Demo;Integrated Security=True;" weight="10"/>
</slaves>
</entityFrameworkConfig>
isSlaveRead// 是否開啟讀寫分離readConnstr// 讀庫鏈接字符串slaves節點// 當讀庫有多個時,通過weight支持權重輪詢讀庫功能。(readConnstr配置不為空時,將忽略slaves節點)
指定字段更新
目前封裝了3種形式的,指定字段更新方法。
- 對象不存在上下文
var user = new User { Id = 2, Name = Guid.NewGuid().ToString() };
DemoDbContext.CurrentDb.UpdateField(user, "Name");
- 對象已存在上下文
var user = new User { Id = 2, Name = Guid.NewGuid().ToString() };
DemoDbContext.CurrentDb.UpdateField(user, x => x.Id == 2, "Name");
- 對象為IEntity,無論是否存在上下文均支持
var user = new User { Id = 2, Name = Guid.NewGuid().ToString() };
DemoDbContext.CurrentDb.UpdateEntityField(user, "Name");
事務
-
事務類型
在.NET 中,事務分SQLTransaction和TransactionScope。后者在MSDTC(Distributed Transaction Coordinator)開啟的時候,支持分布式事務。- TransactionScopeOption
- Required
- 默認方式,如果存在環境事務,直接取環境事務,如果不存在,則創建新的
- RequiresNew
- 直接創建新的環境事務
- Suppress
- 取消當前區域環境事務
- Required
- TransactionScopeOption
-
隔離等級IsolationLevel
- ReadUncommitted(讀未提交)
- 表示:未提交讀。當事務A更新某條數據的時候,不容許其他事務來更新該數據,但可以進行讀取操作
- ReadCommitted(讀提交)
- 表示:提交讀。當事務A更新數據時,不容許其他事務進行任何的操作包括讀取,但事務A讀取時,其他事務可以進行讀取、更新
- RepeatableRead
- 表示:重復讀。當事務A更新數據時,不容許其他事務進行任何的操作,但是當事務A進行讀取的時候,其他事務只能讀取,不能更新
- Serializable
- 表示:序列化。最嚴格的隔離級別,當然並發性也是最差的,事務必須依次進行。
- 默認級別
- Oracle read committed
- SqlServer read committed
- MySQL(InnoDB) Read-Repeatable
- ReadUncommitted(讀未提交)
-
事務特性(ACID)
- 原子性(Atomicity)
- 事務是數據庫的邏輯工作單位,事務中的諸多操作要么全做要么全不做
- 一致性(Consistency)
- 事務執行結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態
- 隔離性(Isolation)
- 一個數據的執行不能被其他事務干擾
- 持續性/永久性(Durability)
- 一個事務一旦提交,它對數據庫中的數據改變是永久性的
- 原子性(Atomicity)
說了那么多,本插件對事務的支持:
DemoDbContext.CurrentDb.TransExecute(x => {
x.Users.Add(new User());
return x.SaveChanges();
});
針對事務,同時支持鎖的讀取功能
var userList = DemoDbContext.CurrentDb.NoLockFunc(db => db.Users.ToList());
Entity
類似ABP框架,提供了IEntity,ICreatorEntity,IModifyEntity,IAuditionEntity,IDeletionEntity等等
