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