如何在ASP.NET C#中开发接收含数组JSON数据的Post方法Web API
ASP.NET C# Web API Post方法实现:存储作业卡数据到数据库
1. 创建对应的数据模型类
定义与JSON结构匹配的实体类,通过JsonPropertyName特性确保JSON字段与C#属性正确映射,同时配置数据库主键与关联关系:
using System.Text.Json.Serialization; using System.ComponentModel.DataAnnotations; public class JobCard { [Key] [JsonPropertyName("jobcardID")] public string JobcardID { get; set; } [JsonPropertyName("breakdownID")] public string BreakdownID { get; set; } [JsonPropertyName("vehicleNumber")] public string VehicleNumber { get; set; } [JsonPropertyName("ODOmeter")] public long ODOmeter { get; set; } [JsonPropertyName("spareparts")] public List<SparePart> Spareparts { get; set; } = new List<SparePart>(); [JsonPropertyName("totalSpareCost")] public decimal TotalSpareCost { get; set; } [JsonPropertyName("totalLabourTime")] public string TotalLabourTime { get; set; } [JsonPropertyName("totalLabourCost")] public decimal TotalLabourCost { get; set; } [JsonPropertyName("TotalCost")] public decimal TotalCost { get; set; } [JsonPropertyName("vehicleRecoveryTime")] public DateTime VehicleRecoveryTime { get; set; } } public class SparePart { [Key] [JsonPropertyName("spItemCode")] public int SpItemCode { get; set; } [JsonPropertyName("spitemName")] public string SpitemName { get; set; } [JsonPropertyName("spitemCost")] public decimal SpitemCost { get; set; } [JsonPropertyName("spitemManhours")] public int SpitemManhours { get; set; } [JsonPropertyName("spitemEstStartDTM")] public DateTime SpitemEstStartDTM { get; set; } [JsonPropertyName("spitemEstEndDTM")] public DateTime SpitemEstEndDTM { get; set; } // 外键关联JobCard主表 public string JobcardID { get; set; } public JobCard JobCard { get; set; } }
2. 配置Entity Framework Core DbContext
创建DbContext类,定义数据库集并配置一对多的实体关系:
using Microsoft.EntityFrameworkCore; public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public DbSet<JobCard> JobCards { get; set; } public DbSet<SparePart> SpareParts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置JobCard与SparePart的一对多关联 modelBuilder.Entity<JobCard>() .HasMany(j => j.Spareparts) .WithOne(s => s.JobCard) .HasForeignKey(s => s.JobcardID) .OnDelete(DeleteBehavior.Cascade); } }
3. 编写API控制器的Post方法
创建API控制器,注入DbContext实现数据存储逻辑,包含模型验证、异常处理与返回结果:
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; [Route("api/[controller]")] [ApiController] public class JobCardsController : ControllerBase { private readonly AppDbContext _context; public JobCardsController(AppDbContext context) { _context = context; } // POST: api/JobCards [HttpPost] public async Task<ActionResult<JobCard>> PostJobCard(JobCard jobCard) { if (!ModelState.IsValid) { return BadRequest(ModelState); } try { _context.JobCards.Add(jobCard); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetJobCard), new { id = jobCard.JobcardID }, jobCard); } catch (DbUpdateException ex) { if (JobCardExists(jobCard.JobcardID)) { return Conflict("作业卡ID已存在"); } else { return StatusCode(StatusCodes.Status500InternalServerError, "数据存储失败:" + ex.InnerException?.Message); } } } // 辅助方法:检查作业卡是否存在 private bool JobCardExists(string id) { return _context.JobCards.Any(e => e.JobcardID == id); } // 可选:添加Get方法用于验证存储结果 [HttpGet("{id}")] public async Task<ActionResult<JobCard>> GetJobCard(string id) { var jobCard = await _context.JobCards.Include(j => j.Spareparts) .FirstOrDefaultAsync(j => j.JobcardID == id); if (jobCard == null) { return NotFound(); } return jobCard; } }
4. 关键配置与注意事项
- 数据库连接配置:在
appsettings.json中添加连接字符串:
并在"ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=JobCardDb;Trusted_Connection=True;MultipleActiveResultSets=true" }Program.cs中注册DbContext:builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); - 模型验证:
[ApiController]特性会自动触发模型验证,可在实体类属性上添加[Required]、[MaxLength]等特性增强数据合法性检查。 - 事务保障:EF Core默认在
SaveChangesAsync时开启事务,确保主表与子表数据同时提交或回滚。 - 数据类型适配:将JSON中的字符串类型成本、工时转换为C#的
decimal/int类型,保证数据库存储精度。
内容的提问来源于stack exchange,提问作者srinivasarao jella
相关产品推荐
相关产品推荐

