NCC ShardingCore 是一款 EntityFramework Core based 高性能、輕量級、分表分庫、讀寫分離解決方案,具有零依賴、零學習成本、零業務代碼入侵等特點。ShardingCore 7.0 已于近期發布。
從 ShardingCore 7.0 開始,啟用版本號第二位來對應不同的 EFCore ?版本,如?7.6.0.5?針對的是?EFCore 6.x?等。
變更日志
添加對?EF Core 7.0?的支持
移除?IShardingModelCacheOption,為默認緩存設置進行了建議配置
添加模型并發等級,以便解決模型超時 BUG
修正 FromSqlRaw 丟失?where?子句的 BUG #217
修正分片路由為空時,join?未分片對象,導致分片對象被誤認為非分片對象的 BUG
修正集成使用?Z.EntityFramework.Plus?批量處理時報錯的 BUG #179
啟用了全新的版本規范,版本號第二位對應?EF Core?版本號
其他
重要提示
升級如果不使用
app.ApplictaionServices.UseAutoShardingCreate()
將不會自動創建表任務;如果使用 IIS 代理,需要關閉應用程序池的固定回收,并將空閑回收設置為?
0
,否則 ShardingCore 的建表任務可能不會生效。
與其他開發框架的集成
目前,NCC ShardingCore 能與多款開發框架進行集成,開發者可以通過閱讀項目文檔,對照官方 DEMO 快速上手集成。ShardingCore 目前提供了以下開發框架的集成 DEMO:
原生?EF Core?(自不必說)
Volosoft AbpVNext
Volosoft AbpZero
Furion
WTM
詳情可參考:
https://github.com/dotnetcore/sharding-core/tree/main/samples
https://www.cnblogs.com/xuejiaming/p/16450663.html
Volosoft AbpVNext?Demohttps://github.com/xuejmnet/ShardingWithFramework/tree/main/abp/toapp
FurionDemohttps://github.com/xuejmnet/ShardingWithFramework/tree/main/furion
WTM?Demohttps://github.com/xuejmnet/ShardingWithFramework/tree/main/wtm
現有系統接入注意事項
現有系統接入 ShardingCore,需要注意以下幾點
批處理 Batch Ops
ShardingCore 支持?Ef Core?生態下的多個批處理框架,其中代表作比如:
Z.EntityFramework.Plus.EFCore
EFCore.BulkExtensions
默認的?EF Core??批處理基于當前?DbContext,如果開發者自定替換了?DbContext,則在集成 ShardingCore 時,需要注意批處理的兼容情況。ShardingCore 在默認情況下,ShellDbContext?帶多個?ExecutorDbContext,ShellDbContext?會代理原有的查詢,故而原有的批處理工作不能在?DbContext?中使用。
具體可參考 ShardingCore 批量操作文檔:https://xuejmnet.github.io/sharding-core-doc/adv/batch-operate/
追蹤 Tracking
默認情況下,ShardingCore 支持?EFCore?的追蹤功能(即便是讀寫分離的情況下),支持包括?Select、Add、Update?和?Remove,但無法獲取?DbContext.ChangeTracker?下的方法。目前有兩種解決方案:
重寫?ChangeTracker,可以參考本項目的?ShardingChangeTracker,通過替換?IChangeTrackerFactory?來實現;
通過?AbstractShardingDbContext?下的?IShardingDbContextExecutor?獲得當前?DbContext,而后進行相應的操作。
如果需要在?SaveChanges?時對一些變更新信息進行記錄(如審計等),可通過重寫帶有?Boolean?參數的?SaveChanges?方法來達到目的:
public?override?int?SaveChanges(bool?acceptAllChangesOnSuccess)
{if?(IsExecutor){//?審計操作//?ChangeTracker.Entries().Where(xxx)}return?base.SaveChanges(acceptAllChangesOnSuccess);
}
常見問題
使用外鍵報錯
建議移除外鍵。參考:
https://github.com/dotnetcore/sharding-core/blob/main/samples/Sample.Migrations/RemoveForeignKeyMigrationsModelDiffer.cs
沒有自動建表
檢查 IIS 設置,關閉應用程序池的固定回收,并將空閑回收設置為?
0
;檢查數據庫連接對應的賬戶是否具有建表權;
檢查各路由建表的時間節點所對應的日志;
選擇開啟?DoLogError,錯誤日志將詳細輸出。
不想在默認的時間點建表
修改對應的?CRON?表達式方法:*GetCronExpressions()*,并重寫?IncrementMinutes?的值。
如何選擇版本
ShardingCore 版本號中的第二位對應了?EF Core?的版本號,因此在選擇 ShardingCore 時,請認準第二位版本號的編號;ShardingCore 第一位表示大版本號,第三位和第四位是小版本號,一般這三位數選擇最新版本即可。
EFCore 7.x?選擇?ShardingCore 7.7.x.x
EFCore 6.x?選擇?ShardingCore 7.6.x.x
EFCore 5.x?選擇?ShardingCore 7.5.x.x
EFCore 3.x?選擇?ShardingCore 7.3.x.x
EFCore 2.x?選擇?ShardingCore 7.2.x.x