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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Galosys.Foundation.EntityFrameworkCore.Dm" Version="26.10.29.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Galosys.Foundation.EntityFrameworkCore.Dm" Version="26.10.29.1" />
                    
Directory.Packages.props
<PackageReference Include="Galosys.Foundation.EntityFrameworkCore.Dm" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Galosys.Foundation.EntityFrameworkCore.Dm --version 26.10.29.1
                    
#r "nuget: Galosys.Foundation.EntityFrameworkCore.Dm, 26.10.29.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Galosys.Foundation.EntityFrameworkCore.Dm@26.10.29.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Galosys.Foundation.EntityFrameworkCore.Dm&version=26.10.29.1
                    
Install as a Cake Addin
#tool nuget:?package=Galosys.Foundation.EntityFrameworkCore.Dm&version=26.10.29.1
                    
Install as a Cake Tool

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 测试项目,覆盖:

  1. EfCoreDmModuleContractTest.Module_Is_Internal_And_Implements_IModule:反射验证模块类型契约。
  2. EfCoreDmModuleContractTest.Module_Has_ModuleInfoAttribute_And_OrderAttribute:验证 [ModuleInfo("EntityFrameworkCore.Dm")] 与 [Order(50)] 元数据。
  3. EfCoreDmModuleContractTest.AddEfCoreDm_Public_Extension_DoesNotExist:硬删除验证,全程序集无 AddEfCoreDm(IServiceCollection) 残留。
  4. EfCoreDmAutoDiscoveryTest.Module_Register_DmProvider_When_ConfigureServices_Called:直接反射构造模块 + 调用 ConfigureServices,验证 EfCoreDatabaseProviderFactory.TryGet("Dm", ...) 命中。
  5. 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.EntityFrameworkCore 9.0.0.43760(达梦官方 EF Core provider,目前最高稳定版本仅支持 EF Core 9.0.x;与主模块 EF Core 10.0.x 通过 NuGet 自动回退共存)
  • DM.DmProvider 8.3.1.x(达梦官方 ADO.NET provider,DM.Microsoft.EntityFrameworkCore 传递依赖)

子模块模板(供后续 KingbaseES / OceanBase / ClickHouse 复用)

本子模块是 EF Core 驱动子模块的参考实现。要新增第 N 个驱动子模块,仅需 2 件事:

  1. 新建 framework/src/Galosys.Foundation.EntityFrameworkCore.<Name>/ 目录,含 csproj(参考 Galosys.Foundation.EntityFrameworkCore.Dm.csproj,显式引用 Galosys.Foundation.Core + Galosys.Foundation.EntityFrameworkCore)。
  2. 在子模块命名空间(如 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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