У меня есть базовый API, разработанный с использованием ASP.NET Core, Entity Framework Core и JsonApiDotNetCore. Когда я пытаюсь выполнить, я получаю следующее исключение:
Unable to load one or more of the requested types.
Method 'CommitAsync' in type 'JsonApiDotNetCore.Extensions.SafeTransactionProxy' from assembly 'JsonApiDotNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
Может ли кто-нибудь помочь мне с тем, что я делаю неправильно здесь, пожалуйста.
Мой код: Класс модели:
using JsonApiDotNetCore.Models;
using System;
namespace FF_Reports_API.Model
{
public class Pitch : Identifiable
{
[Attr("id")]
public Int64 id { get; set; }
[Attr("pitch_name")]
public string pitch_name { get; set; }
}
}
Контроллер:
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Controllers;
using JsonApiDotNetCore.Services;
using Microsoft.Extensions.Logging;
using FF_Reports_API.Model;
using Microsoft.Extensions.Configuration;
using FF_Reports_API.Services;
namespace FF_Reports_API.Controllers
{
public class PitchController : JsonApiController<Pitch>
{
private readonly IPitchService _pitchService;
IConfiguration _Configuration;
public PitchController(
IJsonApiContext jsonApiContext,
IResourceService<Pitch> resourceService,
ILoggerFactory loggerFactory,
IConfiguration configuration,
IPitchService pitchService)
: base(jsonApiContext, resourceService, loggerFactory)
{
_Configuration = configuration;
_pitchService = pitchService;
}
//[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[HttpGet]
public async Task<IActionResult> Pitches()
{
var pitches = await _pitchService.GetPitches();
if (pitches.Count == 0)
{
return NotFound();
}
return Ok(pitches);
}
}
}
Интерфейс:
using FF_Reports_API.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace FF_Reports_API.Services
{
public interface IPitchService
{
public Task<List<Pitch>> GetPitches();
}
}
Класс обслуживания:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using FF_Reports_API.Context;
using FF_Reports_API.Model;
using FF_Reports_API.Services;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
namespace FF_Reports_API.Services
{
public class PitchService : IPitchService
{
readonly IConfiguration _configuration;
readonly AppDbContext _appDbContext;
public PitchService(IConfiguration configuration, AppDbContext appDbContext)
{
this._configuration = configuration;
this._appDbContext = appDbContext;
}
public async Task<List<Pitch>> GetPitches()
{
var dtPitches = new DataTable();
var PitchesList = new List<Pitch>();
using (var _dbContext = _appDbContext)
{
SqlConnection con = (SqlConnection)_dbContext.Database.GetDbConnection();
using (con)
{
var cmd = new SqlCommand("[PitchPower2].[uspGetPitches]", con);
cmd.CommandType = CommandType.StoredProcedure;
using (var dataAdapter = new SqlDataAdapter(cmd))
{
dataAdapter.Fill(dtPitches);
}
if (dtPitches.Rows.Count > 0)
{
PitchesList = dtPitches.AsEnumerable()
.Select(x => new Pitch
{
id = (Int64)x["id"],
pitch_name = (string)x["pitch_name"]
}).ToList();
}
}
}
return PitchesList;
}
}
}
Запускать:
using FF_Reports_API.Context;
using JsonApiDotNetCore.Extensions;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace FF_Reports_API
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//services.AddControllers();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
services.AddMvc(options => options.EnableEndpointRouting = false);
// Add the Entity Framework Core DbContext like you normally would
services.AddDbContext<AppDbContext>(options =>
{
// Use whatever provider you want, this is just an example
options.UseSqlServer(Configuration.GetConnectionString("Connection"));
});
// Add JsonApiDotNetCore
services.AddJsonApi<AppDbContext>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AppDbContext context)
{
app.UseHttpsRedirection();
app.UseRouting();
app.UseJsonApi();
//app.UseEndpoints(endpoints => endpoints.MapControllers());
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=PitchController}/{action=Pitches}/");
});
}
}
}
Строка подключения находится в appsettings.json.
@vernou, спасибо, что изучили это. код csproj ниже:<Project Sdk = "Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <RootNamespace>FF_Reports_API</RootNamespace> </PropertyGroup> <ItemGroup> <PackageReference Include = "JsonApiDotNetCore" Version = "3.1.0" /> <PackageReference Include = "Microsoft.EntityFrameworkCore" Version = "5.0.17" /> <PackageReference Include = "Microsoft.EntityFrameworkCore.SqlServer" Version = "5.0.17" /> </ItemGroup> </Project>
Пакет JsonApiDotNetCore
в версии 3.1.0 зависит от Microsoft.EntityFrameworkCore
в версии 2.1.0. Но ваш проект форсирован Microsoft.EntityFrameworkCore
в версии 5.0.17.
Microsoft.EntityFrameworkCore
5 ретро-совместима с Microsoft.EntityFrameworkCore
2.1.
Вам нужно выровнять зависимость версии Microsoft.EntityFrameworkCore
между вашим проектом и JsonApiDotNetCore
.
Для этого вы можете понизить Microsoft.EntityFrameworkCore
версию до 2.1. Но эта версия не поддерживается Microsoft.
Или вы можете обновить Microsoft.EntityFrameworkCore
версию до 6 и JsonApiDotNetCore
до 5.
Ни одна
JsonApiDotNetCore
версия не поддерживаетMicrosoft.EntityFrameworkCore
5.
Спасибо @vernou. После переустановки правильных версий моя проблема была решена.
Похоже на ошибку зависимостей версии микширования. Можете ли вы показать зависимости с версией, используемой вашим проектом? (Вы можете просто добавить csproj).