Enterprise Library(EntLib)5.0 預設僅內建 SQL Server、Oracle 等數據庫提供者。要在 EntLib 框架下使用 MySQL,需實現自定義 Database 與 DatabaseData 類,並通過配置文件註冊提供者映射。本文基於 EntLibContrib MySQL 擴展項目(MySQLDAAB)說明完整集成步驟。
public class MySQLDatabaseData : DatabaseData
{
public MySQLDatabaseData(ConnectionStringSettings connectionStringSettings,
IConfigurationSource configurationSource)
: base(connectionStringSettings, configurationSource) { }
public override IEnumerable GetRegistrations()
{
yield return new TypeRegistration(
() => new MySQLDatabase(
ConnectionString,
Container.Resolved(Name)))
{
Name = Name,
Lifetime = TypeRegistrationLifetime.Transient
};
}
}
[ConfigurationElementType(typeof(MySQLDatabaseData))]
public class MySQLDatabase : Database
{
public MySQLDatabase(string connectionString)
: base(connectionString, MySqlClientFactory.Instance) { }
public MySQLDatabase(string connectionString, IDataInstrumentationProvider instrumentationProvider)
: base(connectionString, MySqlClientFactory.Instance, instrumentationProvider) { }
}
關鍵點:
[ConfigurationElementType] 屬性將配置元素類型綁定至 MySQLDatabaseData,使 EntLib 配置系統能識別自定義節點。MySqlClientFactory.Instance,確保使用 MySQL Connector/NET 的 ADO.NET 提供者工廠。生成 MySQLDAAB.dll 與 EntLibContrib.Data.MySql.dll,供主項目引用。
<configSections>
<section name="dataConfiguration"
type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,
Microsoft.Practices.EnterpriseLibrary.Data" />
</configSections>
<dataConfiguration>
<providerMappings>
<add name="MySql.Data.MySqlClient"
databaseType="EntLibContrib.Data.MySql.MySqlDatabase, MySQLDAAB" />
</providerMappings>
</dataConfiguration>
<system.data>
<DbProviderFactories>
<add name="MySql Data Provider Factory"
invariant="MySql.Data.MySqlClient"
description=".NET Framework Data Provider for MySQL"
type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
</DbProviderFactories>
</system.data>
說明: invariant 名稱必須與 providerMappings 中的 name 完全一致,且與連接字符串 providerName 對應。
<connectionStrings>
<add name="TestDB_MySQL"
connectionString="server=127.0.0.1;database=test;User Id=root;Password=****;Persist Security Info=True;"
providerName="MySql.Data.MySqlClient" />
</connectionStrings>
// 通過 EntLib 統一入口獲取 Database 實例
Database db = EnterpriseLibraryContainer.Current.GetInstance("TestDB_MySQL");
// 執行查詢
using (IDataReader reader = db.ExecuteReader(CommandType.Text, "SELECT * FROM users"))
{
while (reader.Read()) { /* ... */ }
}
// 執行非查詢
int affected = db.ExecuteNonQuery(CommandType.Text, "UPDATE users SET last_login = NOW() WHERE id = @id",
db.CreateParameter("@id", 123));
| 現象 | 原因 | 解決 |
|---|---|---|
| ActivationException: 未找到類型 | 程序集未引用或版本不匹配 | 確認 MySQLDAAB、MySql.Data、EntLib 核心程序集版本一致,且 Copy Local = true |
| ConfigurationErrorsException: providerMapping | invariant 名稱不一致 | 檢查 system.data/providerMappings/connectionStrings 三處 providerName 完全一致 |
| MySqlException: Unable to connect | 連接字符串錯誤/防火牆/權限 | 驗證 server、port、uid、pwd、sslmode 參數;測試網絡連通性 |
MySql.Data 依賴Microsoft.Extensions.Configuration + Dapper/EFCore 輕量級方案。