Galosys.Foundation.EntityFrameworkCore.Dm
26.10.29.1
dotnet add package Galosys.Foundation.EntityFrameworkCore.Dm --version 26.10.29.1
NuGet\Install-Package Galosys.Foundation.EntityFrameworkCore.Dm -Version 26.10.29.1
<PackageReference Include="Galosys.Foundation.EntityFrameworkCore.Dm" Version="26.10.29.1" />
<PackageVersion Include="Galosys.Foundation.EntityFrameworkCore.Dm" Version="26.10.29.1" />
<PackageReference Include="Galosys.Foundation.EntityFrameworkCore.Dm" />
paket add Galosys.Foundation.EntityFrameworkCore.Dm --version 26.10.29.1
#r "nuget: Galosys.Foundation.EntityFrameworkCore.Dm, 26.10.29.1"
#:package Galosys.Foundation.EntityFrameworkCore.Dm@26.10.29.1
#addin nuget:?package=Galosys.Foundation.EntityFrameworkCore.Dm&version=26.10.29.1
#tool nuget:?package=Galosys.Foundation.EntityFrameworkCore.Dm&version=26.10.29.1
Galosys.Foundation.EntityFrameworkCore.Dm
达梦(DM)数据库 EF Core 驱动子模块。基于 EfCoreDatabaseProviderFactory 注册 "Dm" provider,通过 IModule 自动发现与装配。
本子模块为 change-3 交付物,将 change-2 的
services.AddEfCoreDm()显式扩展重构为EfCoreDmModule : IModule自动发现范式,与仓库现有 132+ 个模块(LazyCaptchaModule、EasyNetQModule、NacosNamingModule 等)保持一致。
自动发现
无需任何额外代码:宿主在 Program.cs 调用 host.UseModularization() + 引用本包即生效。
// Program.cs / Startup
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
// 一行启用模块化(含 Core + EntityFrameworkCore + EntityFrameworkCore.Dm 等所有模块)
builder.Host.UseModularization();
EfCoreDmModule 由 Core 的 DiscoverModules() 反射 + 拓扑排序自动发现并装配,在 ConfigureServices 中调用 EfCoreDatabaseProviderFactory.Register("Dm", ...)。宿主无需调用任何公开扩展方法——原 change-2 的 AddEfCoreDm() 已被本 change 删除(不留 [Obsolete] 过渡期,change-2 未发布)。
连接串格式
达梦连接串须以 provider=Dm 前缀接入(大小写不敏感),其余字段遵循达梦官方规范:
// appsettings.json
{
"ConnectionStrings": {
"DmDb": "Host=localhost;Port=5236;Database=DAMENG;User Id=SYSDBA;Password=SYSDBA;provider=Dm"
}
}
// 或环境变量
Environment.SetEnvironmentVariable("ConnectionStrings__DmDb",
"Host=192.168.1.10;Port=5236;Database=PROD;User Id=APP_USER;Password=***;provider=Dm");
达梦连接串常见字段(详见达梦官方文档):
| 字段 | 说明 | 示例 |
|---|---|---|
Host |
服务器地址 | localhost、192.168.1.10 |
Port |
端口(默认 5236) | 5236 |
Database |
数据库名 | DAMENG |
User Id |
登录用户 | SYSDBA(DBA 账户) |
Password |
登录密码 | SYSDBA(首次安装默认密码,请修改) |
provider |
驱动标识(本子模块约定 Dm) |
Dm |
注意:主模块
AddDbContext(IConfiguration)解析连接串时会自动剥离provider=段,因此上层业务代码无需感知该前缀存在。
加载顺序
EfCoreDmModule 标注 [Order(50)](早于主 EF Core 模块的 DefaultStartupOrder = 1000)。Core 的 DependencyContextExtensions.DiscoverModules 通过 GetCustomAttribute<OrderAttribute>() 反射读取并按 Order 升序排序模块,保证达梦 provider 在主 EF Core 模块的 ConfigureServices(同步调用 AddDbContext → TryGet("Dm"))之前完成注册。
OrderAttribute 是 change-4 公开化的公开 attribute,命名空间 Microsoft.Extensions.DependencyInjection(与 IModule / [ModuleInfo] 同空间),其他驱动子模块(KingbaseES / GaussDB / OceanBase / ClickHouse 等)复用同一机制:[Order(N)],N < 主 EF Core 模块的 1000 即可。
加载顺序的精确调试与边界条件详见
docs/adr/0001-efcore-integration-conventions.md新增的"驱动子模块例外"章节。该章节解释了为何 EF Core 驱动型子模块与常规集成包不同,被有意例外允许通过[ModuleInfo]自动装配。
多 provider 共存
本子模块与主模块默认注册的 5 个 provider(Microsoft.Data.SqlClient / Npgsql / Oracle.ManagedDataAccess.Client / MySql.Data / MySqlConnector)完全独立,可在同一进程内共存,每个 DbContext 通过各自的 [DbContext("ConnName")] + 连接串 provider= 段独立路由:
// appsettings.json
{
"ConnectionStrings": {
"SqlServerDb": "Server=.;Database=AppDb;User Id=sa;Password=***;provider=Microsoft.Data.SqlClient",
"DmDb": "Host=dm;Port=5236;Database=AppDm;User Id=SYSDBA;Password=***;provider=Dm",
"MySqlDb": "Server=mysql;Port=3306;Database=AppMy;User Id=root;Password=***;provider=MySql.Data"
}
}
// Program.cs
builder.Host.UseModularization(); // 自动发现:EfCore、LazyCaptcha、各 DbContext provider 注入等
// 各 DbContext 通过 DbContextAttribute 名称路由到对应连接串:
[DbContext("SqlServerDb")]
public class AppSqlServerContext : DbContext { ... }
[DbContext("DmDb")]
public class AppDmContext : DbContext { ... }
[DbContext("MySqlDb", DbVersion = "4.0.34", MaxRetryCount = 5)]
public class AppMySqlContext : DbContext { ... }
Dynamic / MaxRetryCount / MaxRetryDelaySeconds 等字段由本子模块委托内部读取,与主模块默认 provider 一致:
[DbContext("DmDb", Dynamic = true, MaxRetryCount = 5, MaxRetryDelaySeconds = 30)]
public class AppDmContext : DbContext { ... }
// 本子模块委托内部将调用:dm.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null).EnableDynamicModelCacheKeyFactory(true)
单元测试
本子模块附带 Galosys.Foundation.EntityFrameworkCore.Dm.Tests 测试项目,覆盖:
EfCoreDmModuleContractTest.Module_Is_Internal_And_Implements_IModule:反射验证模块类型契约。EfCoreDmModuleContractTest.Module_Has_ModuleInfoAttribute_And_OrderAttribute:验证[ModuleInfo("EntityFrameworkCore.Dm")]与[Order(50)]元数据。EfCoreDmModuleContractTest.AddEfCoreDm_Public_Extension_DoesNotExist:硬删除验证,全程序集无AddEfCoreDm(IServiceCollection)残留。EfCoreDmAutoDiscoveryTest.Module_Register_DmProvider_When_ConfigureServices_Called:直接反射构造模块 + 调用ConfigureServices,验证EfCoreDatabaseProviderFactory.TryGet("Dm", ...)命中。EfCoreDmAutoDiscoveryTest.Module_Preserves_Default_Providers:验证模块注册不影响主模块默认 5 个 provider。
dotnet test --filter "FullyQualifiedName~EfCoreDmModuleContractTest|FullyQualifiedName~EfCoreDmAutoDiscoveryTest"
依赖:
Galosys.Foundation.EntityFrameworkCore(主模块,传递依赖EfCoreDatabaseProviderFactory)Galosys.Foundation.Core(显式引用 change-3 引入,承载IModule/[ModuleInfo]契约)DM.Microsoft.EntityFrameworkCore9.0.0.43760(达梦官方 EF Core provider,目前最高稳定版本仅支持 EF Core 9.0.x;与主模块 EF Core 10.0.x 通过 NuGet 自动回退共存)DM.DmProvider8.3.1.x(达梦官方 ADO.NET provider,DM.Microsoft.EntityFrameworkCore传递依赖)
子模块模板(供后续 KingbaseES / OceanBase / ClickHouse 复用)
本子模块是 EF Core 驱动子模块的参考实现。要新增第 N 个驱动子模块,仅需 2 件事:
- 新建
framework/src/Galosys.Foundation.EntityFrameworkCore.<Name>/目录,含 csproj(参考Galosys.Foundation.EntityFrameworkCore.Dm.csproj,显式引用Galosys.Foundation.Core+Galosys.Foundation.EntityFrameworkCore)。 - 在子模块命名空间(如
Galosys.Foundation.EntityFrameworkCore.<Name>)下新增EfCore<Name>Module : IModule,internal sealed class,标注[ModuleInfo("EntityFrameworkCore.<Name>")],ConfigureServices内部调用EfCoreDatabaseProviderFactory.Register("<Name>", ...)。
接入 Galosys.Foundation.slnx 并新增同名测试项目,覆盖:
- 模块类型契约(
internal sealed、实现IModule、标注[ModuleInfo])。 - 自动发现端到端(直接反射构造 +
ConfigureServices+ 验证TryGet("<Name>", ...)命中)。
主模块代码 0 改动。详细规范见 change-1 EfCoreDatabaseProviderFactory 文档以及 ADR 0001 "驱动子模块例外"章节。
版本与兼容性
| 组件 | 版本 | 备注 |
|---|---|---|
| 目标框架 | net10.0 |
与主模块一致 |
Microsoft.EntityFrameworkCore(主模块) |
10.0.9 |
主模块依赖 |
Microsoft.EntityFrameworkCore.Relational(DM 包传递) |
9.0.1 |
DM 包官方绑定;与 10.0.x 通过 NuGet 自动回退共存 |
DM.Microsoft.EntityFrameworkCore |
9.0.0.43760 |
达梦官方最高稳定版本(截至 2026-10-09) |
DM.DmProvider |
8.3.1.36935 |
达梦官方 ADO.NET provider |
⚠️ 注意:达梦官方暂未发布 EF Core 10.x provider;本子模块借由 NuGet 自动回退至 net9.0 资源组,与主模块 EF Core 10.0.9 二进制共存。若未来达梦发布 10.x provider,升级
Directory.Packages.props中DmEntityFrameworkCoreVersion即可,无需修改本子模块代码。
galoS@2026-10-09 change-1/-2/-3/-4/-5
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- DM.Microsoft.EntityFrameworkCore (>= 9.0.0.43760)
- Galosys.Foundation.Core (>= 26.10.29.1)
- Galosys.Foundation.EntityFrameworkCore (>= 26.10.29.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 26.10.29.1 | 41 | 10/29/2026 |
| 26.10.20.1 | 87 | 10/20/2026 |
| 26.10.16.2 | 90 | 10/16/2026 |
| 26.10.16.1 | 97 | 10/16/2026 |
| 26.10.9.1 | 92 | 10/9/2026 |