.NET MAUI Integration Testing - FileNotFoundException: Could not load file or assembly Microsoft.Maui.Essentials - entity-framework-core

I'm attempting to integration test a .NET MAUI application utilizing entity framework core.
When the code gets to the line 'this.Database.EnsureCreated()', it gives a file not found exception.
The first thought was trying to reference Microsoft.Maui.Essentials, though when I search for it in NuGet, all I can find is Microsoft.Maui.Essentials.Ref.___ which doesn't seem compatible with my project.
If I try to install it, I get the error 'The package Microsoft.Maui.Essentials.Ref.any 6.0.547 has a package type DotnetPlatform that is incompatible with this project'
How can I resolve this error?
The full length exception is:
System.IO.FileNotFoundException: 'Could not load file or assembly 'Microsoft.Maui.Essentials, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.'
Integration test code:
...
var options = new DbContextOptionsBuilder<DataContext>()
.UseInMemoryDatabase(databaseName: "Test_Database")
.Options;
var mockDataContext = new Mock<DataContext>(options);
mockDataContextCreator
.Setup(x => x.CreateDbContext())
.Returns(new DataContext(options));
...
DataContext.cs
public class DataContext : DbContext
...
public DataContext(DbContextOptions options)
: base(options)
{
SQLitePCL.Batteries_V2.Init();
if (!this.Database.EnsureCreated())
{
this.Database.Migrate();
}
}
The Database property is of type 'Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade' and is defined in the base class 'DbContext'.
Integration Test CSPROJ File:
...
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.0" />
<PackageReference Include="Microsoft.Maui.Dependencies" Version="6.0.547" />
<PackageReference Include="Microsoft.Maui.Extensions" Version="6.0.547" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageReference Include="Moq" Version="4.18.2" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="NUnit.Analyzers" Version="3.3.0" />
<PackageReference Include="coverlet.collector" Version="3.1.2" />
</ItemGroup>
...

The fix is surprisingly easy. Add UseMauiEssentials to your test project file. Alternatively you can utilize UseMaui, the difference is explained here.
At least this worked for me out-of-the-box within almost the same setup (xUnit). Took me few hours to find this after number of more complicated but not robust enough attempts.
One of my failing attempts was to add "Microsoft.Maui.Dependencies" NuGet package. I can see it in your original post. With the fix suggested this NuGet package is not needed.
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UseMauiEssentials>true</UseMauiEssentials>
<IsPackable>false</IsPackable>
</PropertyGroup>

Related

Could not load type Microsoft.EntityFrameworkCore.NpgsqlDbContextOptionsExtensions from assembly Npgsql.EntityFrameworkCore.PostgreSQL

I have 2 EF Core projects A and B
Project A has .net6.0 target and corresponding packages
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.11" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.11" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.7" />
Project B has .netcoreapp3.1 target and corresponding packages
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.2.4" />
While referencing B to A everything builds OK, but on resolving context from B inside of the project A I am getting the following exception:
System.TypeLoadException
Could not load type 'Microsoft.EntityFrameworkCore.NpgsqlDbContextOptionsExtensions' from assembly 'Npgsql.EntityFrameworkCore.PostgreSQL, Version=6.0.7.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7'.
Why B project's context can't use it's own dependancies from lower version of Postrges package? Is it possible to use it like that, because I can't upgrade the project B and I don't want to downgrade project A
So the avalaible (exept some exotic non-supported workarounds) options I found are :
Multi targeting project B with conditional package reference. For example
Multiple target framework project: different versions of the same NuGet package on different frameworks?
In my case it's
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'"> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6"/> <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.22"/> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.22"/> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.2.4"/> </ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net6.0'"> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.11"/> <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="6.0.1"/> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0"/> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.7"/> </ItemGroup>
Proxy a data request to the context through web api or message queue (depending on type of interactions you do with the context data) as the result breaking the direct reference.

Some assembly binding redirects are not generated automatically even if AutoGenerateBindingRedirects is set to true

I have a simple net48 project with some nuget package references. However, some assembly binding redirects are not generated, even if AutoGenerateBindingRedirects and GenerateBindingRedirectsOutputType is set to true!
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
...
<ItemGroup>
<PackageReference Include="Microsoft.WindowsAPICodePack.Core" Version="1.1.0" />
<PackageReference Include="Microsoft.WindowsAPICodePack.Shell" Version="1.1.0" />
<PackageReference Include="ZetaLongPaths" Version="1.0.10.41" />
<PackageReference Include="OxyPlot.Core" Version="2.0.0" />
<PackageReference Include="OxyPlot.WindowsForms" Version="2.0.0" />
...
</ItemGroup>
</Project>
For some of our package references the bindings are generated automatically, however for the 5 I have mentioned above no redirect is added!
Since we are using renovate-bot to update our nuget packages, this will break the automation since we need to add these 5 bindings manually which requires adaption once the version has been changed!
Does anybody know how to get those bindings generated automatically?

Dotnet EF not recognized on multi sdk .net core

I have 2 dotnet core sdk installed on my computer (I have 2 project, one still run on 2.2 and the other running on 3.1)
When I run dotnet ef on my project (that still using v2.2) I got this error :
It was not possible to find any compatible framework version The
framework 'Microsoft.NETCore.App', version '3.1.1' was not found.
- The following frameworks were found:
2.2.8 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
3.1.0 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
You can resolve the problem by installing the specified framework
and/or SDK.
The specified framework can be found at:
- https://aka.ms/dotnet-core-applaunch?framework=Microsoft.NETCore.App&framework_version=3.1.1&arch=x64&rid=win10-x64
I have edit my global.json
{
"sdk": {
"version": "2.2.8",
"rollForward": "latestMajor"
}
}
but the error still appear everytime I need to run dotnet ef
dotnet run still okay ... it still using the correct sdk.
How to fix this ?
thank you
ps my csproj file :
my csproj file
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="jsreport.Client" Version="3.0.1" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.1" PrivateAssets="All" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="4.0.1" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.1.4" />
<PackageReference Include="MailKit" Version="2.0.6" />
</ItemGroup>
</Project>

.net core 2.1 EF Core reverse engineering errors VS 2017

Not having a great time with doing EF Core Reverse Engineering.
Latest error
The method or operation is not implemented.
Scaffold-DbContext "The method or operation is not implemented"
i get the same errors for both of these commands
Running this from Package Manager Console within VS 2017:
Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer
and from command prompt:
dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer
Yes, I do alter them to have both my data source and database.
I get this error
Could not load file or assembly 'System.Diagnostics.DiagnosticSource, Version=4.
0.3.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The located assembly's
manifest definition does not match the assembly reference. (Exception from HRES
ULT: 0x80131040)
I have gotten this before and after i upgraded to the .net core SDK 2.2.101
FYI, my csproj file looks like this
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.4" />
</ItemGroup>
</Project>
Between installing the EF power Tools and the Latest Core 2.2.x.x SDK I am now able to change my project to use dropdown change to the .net core 2.2 (it was previously only able to do 2.1.
Then with Nuget updates etc.. , it finally works!

netcoreapp1.0 not compatible with net45

3 hours of googling and I still can't find an answer
I tried this also: Package [some package] is not compatible with netcoreapp1.0
Still doesn't work, I even added net45 and net40 reference on the imports. Another is problem is my mvc core project doesnt have a package.json
Because you are probably using VS2017, you won't have a project.json since it doesn't exist any longer. So, doing the following will get you to hopefully a working project.
<PropertyGroup>
<TargetFramework>net452</TargetFramework>
<RuntimeIdentifier>win7-x86</RuntimeIdentifier>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNet.SignalR.Core" Version="2.2.1" />
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Owin" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" />
</ItemGroup>
right click your project file edit .csproj, then remove and replace the <propertygroup> </propertygroup> and it's contents. Should work now to reference signalr packages. The unfortunate fun is you have to create your own middleware to tie it into the core framework..
https://www.codeproject.com/Articles/1115941/ASP-NET-Core-Building-a-Real-Time-Online-Poll-Syst
I did create the middleware really quick and it does compile. Whether it works I hadn't gotten that far. Keep in mind that link references the really old stuff before VS2017 and .csproj files for the projects.
hope that helps.