.net core 2.1 EF Core reverse engineering errors VS 2017 - entity-framework

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!

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.

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

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>

The specified invariant name 'System.Data.sqlClient' wasn't found in the list of registered .NET data providers in an ASP.NET Core Web API

I am developing ASP.NET Core Web API for an ASP.NET MVC project. So, all services are written based on MVC and I should only call them, however, I come across the above error. I have tried the below codes, unfortunately, none of them worked.
I used RegisterFactory in the Configure method of the Startup class to add the invariantName:
DbProviderFactories.RegisterFactory("System.Data.SqlClient", System.Data.SqlClient.SqlClientFactory.Instance);
I then added the provider to appsetting.json:
"entityFramework": {
"providers": {
"provider": {
"invariantName": "System.Data.SqlClient",
"type": "System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"
}
}
}
Some additional information:
The .NET Core version is 2.2
The EF version is 6.0.0
The Microsoft.EntityFrameworkCore.Tools version is 3.1.20
You can restore some EntityFrameworkCorenuget packages to 2.0.0.
It seems to have solved this problem for me.
These are the packages I downgraded:
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />

.NET Core build warning due to different versions of EntityFramework

Using VS 2019, several of my projects are generating this build warning when compiling:
5>C:\Program Files (x86)\Microsoft Visual
Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2081,5):
warning MSB3277: Found conflicts between different versions of
"Microsoft.EntityFrameworkCore" that could not be resolved. These
reference conflicts are listed in the build log when log verbosity is
set to detailed.
As the log is not really... verbose (even in detailed mode), I investigated a bit and it seems the error is provoked by Pomelo.EntityFrameworkCore.Mysql/3.1.2 (we are using MariaDB). Here is an extract of a project json, with a dependency on EF 3.1.0 while the current version is 3.1.6:
"Pomelo.EntityFrameworkCore.MySql/3.1.2": {
"type": "package",
"dependencies": {
"Microsoft.EntityFrameworkCore.Relational": "3.1.0",
"MySqlConnector": "[0.61.0, 1.0.0)",
"Pomelo.JsonObject": "2.2.1"
},
Here is an example of PackageReference include sections of a test project for which the warning is happening:
<ItemGroup>
<PackageReference Include="FluentAssertions" Version="5.10.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="NSubstitute" Version="4.2.2" />
<PackageReference Include="XmlUnit.Core" Version="2.8.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="1.3.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
What should I do:
ignore this warning (and wait a pomelo update of the dependency)
downgrade to EF 3.1.0
any other idea?
BR
The test project misses the references to the problmematic packages. it is not enough to only have them added to a project that you reference in a 2nd project.
So add them to the testproject:
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.6" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.2" />
If you still have issues related to System.Configuration.ConfigurationManager also add
<PackageReference Include="System.Configuration.ConfigurationManager" Version="4.7.0" />
to the test csproj.

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>