Некоторое время назад я запустил приложение для сбора данных с метеорологических станций и для его кроссплатформенности я использовал .net core 2.2 mvc вместе с некоторыми библиотеками. Несмотря на то, что данные сохраняются в базе данных mysql, клиент недавно запросил, чтобы выбранные записи метео из списка были сохранены в базе данных локального доступа. Чтобы добиться этого, мне пришлось использовать законного поставщика базы данных от Microsoft, который в данном случае EntityFrameworkCore.Jet . Я не знал, что сначала возникла проблема с совместимостью, в результате которой
Could not load type 'System.Data.OleDb.OleDbConnection' from assembly 'System.Data,
в этой части кода:
var msAccessDb = _msAccessRepo.InitializeDatabaseContext(connectionString);
msAccessDb.Database.OpenConnection();
Теперь дело доходит до того, что у меня естьсделать несколько нацеливания на мои файлы .csproj. Какой синтаксис я должен написать? Первое, что мне нужно сделать, это обновить файл .csproj следующим образом:
<TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>
Но все мои пакеты, такие как automapper, Pomelo.EntityFrameworkCore.MySql, инструменты Entity Framework, NLog, компилируются под netcoreapp2. 2 рамки. Я получаю всевозможные ошибки, в основном CS0234 и CS234, даже с условием внутри XML-части Itemgroup, например:
<PropertyGroup>
<TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.2'">
<PackageReference Include="AutoMapper" Version="9.0.0" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
<PackageReference Include="EntityFrameworkCore.Jet" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
<PackageReference Include="MySql.Data" Version="8.0.17" />
<PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.17" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.2.0" />
<PackageReference Include="System.Drawing.Common" Version="4.6.0" />
</ItemGroup>
Должен ли я понизить версию своего приложения и перейти с .net core на .net framework? Или я делаю что-то не так в своей многоцелевой ориентации?
Заранее благодарю за помощь.
[ РЕДАКТИРОВАТЬ ]
На основеответ ниже, мой файл Project.Web.csproj выглядит следующим образом:
<PropertyGroup>
<TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>
<UserSecretsId>aspnet-myProject.Web-BBF62A3C-EE9E-4808-8924-F2BEA33CDBD6</UserSecretsId>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Drawing.Common" Version="4.6.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461'">
<PackageReference Include="EntityFrameworkCore.Jet" Version="2.2.0" />
<PackageReference Include="System.Data.OleDb" Version="4.6.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.2'">
<PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
<PackageReference Include="AutoMapper" Version="9.0.0" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
<PackageReference Include="MySql.Data" Version="8.0.17" />
<PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.17" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.2.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.2'">
<ProjectReference Include="..\myProject.DB\myProject.DB.csproj" />
<ProjectReference Include="..\myProject.Lib\myProject.Lib.csproj" />
<ProjectReference Include="..\myProject.LoggerService\myProject.LoggerService.csproj" />
</ItemGroup>
Конечно, он начал давать мне ошибки сборки, потому что я должен был применять условия для различных платформ, которые они применяют. Не то чтобы отдельные библиотеки внизу были только проектами .net core 2.2, и они не нацелены ни на какой другой фреймворк. Первоначально я удалил «Условие», но ошибки сборки, такие как следующие, сохраняются (до 850 ошибок).
The type or namespace name 'UserManager<>' could not be found
Iзнаю, что я понял что-то не так, или, может быть, .net core 2.2 не поддерживается как многоцелевой с .net framework, имеющим старую версию 4.6.
Любое дальнейшее обсуждение, чтобы решить эту проблему, или доказать, что это многоцелевоенацеливание не сработает, будет оценено.