Comparing EFCore Database Providers-part-1
ID | Name |
---|---|
1 | Part 1 |
2 | Part 2 |
3 | Part 3 |
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)
Leave a Reply