I wanted to see if there are any differences in EFCore database providers listed at
https://learn.microsoft.com/en-us/ef/core/providers/?tabs=dotnet-core-cli
I want to test the capabilities for each one within a standard choice of tables , in order to know the capabilities
I choose only those that have a version for current STS / LTS , whatever it is current.
( I am particularly interested in SqlServer vs Sqlite )
Problem 1: Conflicting namespaces
For MySql – there are 2 providers , Pomelo.EntityFrameworkCore.MySql and MySql.EntityFrameworkCore . Both have the same namespace and class for .UseMySql ( and other stuff)
So how to do it ? Fortunately, nuget supports alias .
So the code in csproj is
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" Aliases="PomeloEFMySql" />
<PackageReference Include="MySqlConnector" Version="2.2.5" Aliases="MySqlConnect" />
<PackageReference Include="MySql.EntityFrameworkCore" Version="7.0.5" Aliases="MySqlEFOracle" />
<PackageReference Include="MySql.Data" Version="8.1.0" Aliases="OracleMySql"/>
And the code in global.cs
extern alias OracleMySql;
extern alias PomeloEFMySql;
extern alias MySqlConnect;
global using MySqlCNBOracle = MySqlEFOracle.Microsoft.EntityFrameworkCore.MySQLDbContextOptionsExtensions;
global using MySqlOracle = OracleMySql.MySql.Data.MySqlClient;
global using MySqlEF = MySqlEFOracle::Microsoft.EntityFrameworkCore;
global using PomeloCN= MySqlConnect::MySqlConnector;
global using PomeloEF = PomeloEFMySql::Microsoft.EntityFrameworkCore;
global using PomeloMySqlCNB =PomeloEFMySql::Microsoft.EntityFrameworkCore.MySqlDbContextOptionsBuilderExtensions;
And the code to use it
case EFCoreProvider.Pomelo_EntityFrameworkCore_MySql:
var serverVersion = PomeloEF.ServerVersion.AutoDetect(con);
StepExecution.Current.Comment("version " + serverVersion.ToString());
PomeloMySqlCNB.UseMySql(builder,con, serverVersion)
.EnableSensitiveDataLogging()
.EnableDetailedErrors();
break;
case EFCoreProvider.MySql_EntityFrameworkCore:
MySqlCNBOracle.UseMySQL(builder,con);
break;
You can find the results at https://github.com/ignatandrei/TestEFCoreDatabaseProviders and https://ignatandrei.github.io/TestEFCoreDatabaseProviders/
Problem 2 : Conflict on container ports
When a container is started for a test it works on a port ( 1433 for SqlServer). When a new test arrives ( with new tables ) , it cannot be on the same port . So the docker containers must be disposed when the test finishes. Also , the tests must be done in serial, not in paralel.
For parallelism, it is simple ( LightBDD + XUnit)
[assembly: CollectionBehavior(DisableTestParallelization = true)]
[assembly: ClassCollectionBehavior(AllowTestParallelization = false)]
For disposing, can use IScenarioTearDown (LightBDD) or IAsyncLifetime (XUnit)