实体框架核心 + OData 8.0.1 CRUD 操作 ASP.Net 核心 5

时间:2021-07-10 22:42:02

标签: entity-framework-core odata automapper dto

public class Books
{
   public int Id{get;set;}
   public string Name{get;set;}
}
  public class BookController : ODataController
    {
        private readonly IBookRepository _bookRepository;
        private readonly IMapper _mapper;

        public BookController(IBookRepository bookRepository, IMapper mapper)
        {
            _bookRepository = bookRepository;
            _mapper = mapper;
        }

        [EnableQuery]
        [HttpGet]
        public ActionResult Get()  
        {
            try
            {
                IQueryable<BookDto> res = _bookRepository.Books().ProjectTo<BookDto>(_mapper.ConfigurationProvider);

                if (res.Count() == 0)
                    return NotFound();

                return Ok(res);

            }
            catch(Exception)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, "Unable to get Book");
            }
        }

        [HttpGet("{Id}")]
        public async Task<ActionResult<Book>> GetBookById(string Id)
        {
            var book = await  _bookRepository.GetBookById(Id);

            if (book == null)
                return NotFound();

            return book;
        }
     
        [HttpPost]
        public async Task<ActionResult<Book>> Post([fr]CreateBookDto  createBookDto)
        {
            try
            {
                if (createBookDto == null)
                    return BadRequest();

                Book book = _mapper.Map<Book>(createBookDto);

                var result = await _bookRepository.Book(book);

                return CreatedAtAction(nameof(GetBookById), new { id = book.UserId }, result);

            }
            catch (Exception)
            {
               return StatusCode(StatusCodes.Status500InternalServerError,"Failed to save Book information");
            }

        }
    }
 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)
        {

            var connectionStr = Configuration.GetConnectionString("ConnectionString");
            services.AddControllers();
            services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
            services.AddControllers().AddOData(opt => opt.AddRouteComponents("api",GetEdModel()).Select().Filter().Count().Expand());
            services.AddDbContext<AppDbContext>(options => options.UseMySql(connectionStr,ServerVersion.AutoDetect(connectionStr)));
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Book_api", Version = "v1" });
            });

            services.AddScoped<IBookRepository, BookRepository>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Book_api v1"));
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

        }

        private IEdmModel GetEdModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EntitySet<User>("User");
            builder.EntitySet<BookDto>("Book");
    
            return builder.GetEdmModel();
        }
    }

大家好。我正在尝试在我的 ASP.Net Core 5 API 上实现 OData。我可以使用 Get 检索书籍。但我正在努力做一个POST。当我尝试在 Postman 上使用 POST 时,CreateBookDto 属性都返回 null。我试图添加 [FromBody] 也不起作用。这似乎唯一一次是当我用 [ApiController] 装饰控制器时,但这反过来又影响了我的 GET。我不知道该怎么办了。

0 个答案:

没有答案