【问题标题】:How to Add records in DB with foreign key relatationship using .Net core web Api and EF core如何使用.Net core web Api和EF core在具有外键关系的数据库中添加记录
【发布时间】:2021-09-14 21:49:41
【问题描述】:

我正在开发 Web Api CRUD 存储库模式,该模式使用具有主键和外键关系的多个表以及每个表,同时使用单独的 [HttpPost] 方法插入。但是如何在具有外键 Id 属性的子表中插入(发布)记录。

EmpVaccine详细型号:

    public partial class EmpVaccineDetail
    {
    public EmpVaccineDetail()
    {
        CovidInfectionDetails = new HashSet<CovidInfectionDetail>();
        VaccineDoses = new HashSet<VaccineDose>();
    }

    public int EmpVaccineDetailId { get; set; }
    public string VaccineType { get; set; }
    public int UniqueHealthId { get; set; }
    public int BeneficiaryId { get; set; }
    public string VaccinationStatus { get; set; }
    public bool DoYouWantToReportCovid { get; set; }

    public virtual ICollection<CovidInfectionDetail> CovidInfectionDetails { get; set; }
    public virtual ICollection<VaccineDose> VaccineDoses { get; set; }
}

疫苗剂量模型:

    public partial class VaccineDose
    {
    public int VaccineDoseId { get; set; }
    public DateTime DateOfVaccine { get; set; }
    public string VaccineOrganizedBy { get; set; }
    public bool? Reimbursed { get; set; }
    public Guid? CoWinCertificateUploadFileId { get; set; }
    public string HospitalName { get; set; }
    public Guid? ReceiptUploadFileId { get; set; }
    public string VaccineDoseType { get; set; }
    [ForeignKey]
    public int EmpVaccineDetailId { get; set; }

    public virtual EmpVaccineDetail EmpVaccineDetail { get; set; }
}

VaccineDetailsRepository:

    public class VaccineDetailsRepository : IVaccineDetails
   {
    private readonly PeopleWorksContext _peopleWorksContext;
    public VaccineDetailsRepository(PeopleWorksContext peopleWorksContext)
    {
        _peopleWorksContext = peopleWorksContext;
    }

    public async Task<EmpVaccineDetail> Add(EmpVaccineDetail empVaccineDetail)
    {
        await _peopleWorksContext.EmpVaccineDetails.AddAsync(empVaccineDetail);
        await _peopleWorksContext.SaveChangesAsync();
        return empVaccineDetail;
    }
   }

疫苗剂量库:

    public class VaccineDosesRepository : IVaccineDoses
{
    private readonly PeopleWorksContext _peopleWorksContext;
    public VaccineDosesRepository(PeopleWorksContext peopleWorksContext)
    {
        _peopleWorksContext = peopleWorksContext;
    }
    public async Task<VaccineDose> Add(VaccineDose vaccineDose)
    {
        await _peopleWorksContext.VaccineDoses.AddAsync(vaccineDose);
        await _peopleWorksContext.SaveChangesAsync();
        return vaccineDose;
    }
}

控制器:

    public class VaccineDetailsController : ControllerBase
    {
    private readonly IVaccineDetails _vaccineDetails;
    private readonly IVaccineDoses _vaccineDoses;
    public VaccineDetailsController(IVaccineDetails vaccineDetails, IVaccineDoses 
    vaccineDoses)
    {
        _vaccineDetails = vaccineDetails;
        _vaccineDoses = vaccineDoses;
    }

    [HttpPost]
    [Route("VaccineDetails/AddVaccineDetail")]
    public async Task<IActionResult> AddVaccineDetail(EmpVaccineDetail empVaccineDetail)
    {
        try
        {
            await _vaccineDetails.Add(empVaccineDetail);
            return Ok();
        }
        catch (Exception ex)
        {
            return StatusCode(StatusCodes.Status500InternalServerError, ex);
        }
    }

    [HttpPost]
    [Route("VaccineDetails/AddVaccineDose")]
    public async Task<IActionResult> AddVaccineDose(VaccineDose vaccineDose)
    {
        try
        {
            await _vaccineDoses.Add(vaccineDose);
            return Ok();
        }
        catch (Exception ex)
        {
            return StatusCode(StatusCodes.Status500InternalServerError, ex);
        }
    }
   }

我在第一个表中添加了数据,但是在第二个表中插入时,我如何传递外键属性。请建议。谢谢

【问题讨论】:

  • 你能显示意见吗?很难理解您要发布哪些数据。
  • 您好,服务,没有查看页面。我正在 Postman 上进行测试。您可以看到模型属性,这就是我要发布的内容。
  • 基本上:从数据库中获取并发布。目前尚不清楚是什么阻止您这样做,因为我们看不到发布对象的内容。
  • 嗨,@GertArnold,在添加 [AddVaccineDetail] 时,我正在传递这个 Json 内容 { "EmpVaccineDetailId":1, "VaccineType": "Test", "UniqueHealthId":"111", "BeneficiaryId":"222", "VaccinationStatus":"Fully Vaccinated", "DoYouWantToReportCovid": false } 但是当我发布 [AddVaccineDose] 这个时,我将如何传递那个 'EmpVaccineDetailId' 属性外键关系。这就是我的困惑,
  • 发布EmpVaccineDetailId 并不比发布DateOfVaccine 和其他属性更难。正如我所说:从数据库中获取值并发布它。

标签: c# entity-framework-core asp.net-core-webapi asp.net-core-5.0


【解决方案1】:

在点击这个 VaccineDetails/AddVaccineDose url 时,只需通过 json 传递 EmpVaccineDetailId。

{
    "DateOfVaccine ": "2021-05-25 00:52:29.5086347",
    .............
     ............
    "EmpVaccineDetailId ":1
}

确保您拥有 EmpVaccineDetailId = 1 的 EmpVaccineDetail 数据。VaccineDose 和 EmpVaccineDetail 之间的关系是一对多的,EF Core 会自动绑定它们。

【讨论】:

  • 嗨@RafidShahriar,感谢您的回复。所以每次当我发布“VaccineDetails/AddVaccineDose”时,我都必须使用 EmpVaccineDetailId 传递这个 Json,或者有没有其他方法可以传递那个外键 ID?谢谢{ "VaccineDoseId":2, "DateOfVaccine":"2021-07-02", "VaccineOrganizedBy":"Self", "Reimbursed":false, "HospitalName":"Abcd", "VaccineDoseType":"First Dose", "EmpVaccineDetailId":1 }
  • 这是传递外键的常规方式。此外,您可以在 JSON 中传递整个 EmpVaccineDetail 模型。但那是另一种情况。如果您有困惑,可以点击此链接:entityframeworktutorial.net/efcore/conventions-in-ef-core.aspx
  • 感谢您的参考。我很感激。还有一件事,如果我想从两个表中获取数据,我怎么能得到它。我正在使用它,但出现错误。请帮忙
  • Repository code :: ` public async Task> GetAll() { //return await _peopleWorksContext.EmpVaccineDetails.ToListAsync(); var 疫苗详情 = 等待 _peopleWorksContext.EmpVaccineDetails .Include(v => v.VaccineDoses) .ToListAsync();返回疫苗详情; }`
  • 控制器代码 :: ` public async Task GetVaccineDetails() { try { return Ok(await _vaccineDetails.GetAll()); } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, ex); } }`
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2020-08-11
  • 2019-08-30
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
相关资源
最近更新 更多