swagger 使用EF Core的Crud Web API C#

4zcjmb1e  于 2023-06-29  发布在  C#
关注(0)|答案(1)|浏览(136)

我在API中遇到了一个问题,因为我在post/put方法中的一个类中有一个外键,它要求我提供这两个类的信息。对于get方法来说,这是有意义的,因为我想在前端打印信息,顺便说一下,我在前端使用blazor。我也使用SQLite作为数据库。
以下是类-Certification

public partial class Certification
{
    public long Id { get; set; }

    public string Name { get; set; } = null!;

    public virtual ICollection<Exam> Exams { get; set; } = new List<Exam>();
}

public partial class Exam
{
    public int Id { get; set; }

    public long? CertificationId { get; set; }

    public string Name { get; set; } = null!;
    public long MinimumGrade { get; set; }

    public virtual Certification? Certification { get; set; }
    public virtual ICollection<ExamAttempt> ExamAttempts { get; set; } = new List<ExamAttempt>();
}

我正在使用Swagger来看看后端发生了什么。
It asks for all this information when I'm trying to add an exam
When I only want to asks for this information
考虑到在前端我想为每个认证做一个粗糙的考试。

mu0hgdu0

mu0hgdu01#

您不应该将数据库模型与请求模型混合使用,这是一种不好的做法,而且存在安全风险。
您应该创建DTO,并使每个操作的数据最小化,因此,如果要将认证添加到检查中,则应该单独执行此操作以添加检查。
以下是DTO示例:

public class CertificationDto
{
    public long Id { get; set; }
    public string Name { get; set; } = null!;
}

public class ExamDto
{
    public int Id { get; set; }
    public long? CertificationId { get; set; }
    public string Name { get; set; } = null!;
    public long MinimumGrade { get; set; }
}

public class ExamCertDto
{
    public int ExamId { get; set; }
    public long CertificationId { get; set; }
}

您可以像这样将DTOMap到数据库模型

public IActionResult AddExam(ExamDto examDto)
{
    Exam e = new {
        Name = examDto.Name,
        MinimumGrade = examDto.MinumumGrade
    };

    dbcontext.Exams.Add(e);

    return Ok(e.Id);
}

或者,如果要将证书添加到检查:

public IActionResult AddCertToExam(ExamCertDto ec)
{
    var exam = dbcontext.Exams.SingleOrDefault(e => e.Id == ec.ExamId);
    exam.CertificationId = ex.CertificationId;

    dbcontex.Save();

    return Ok(exam.Id);
}

如果你真的必须在一个操作中使用两个,你只需将Exam更改为如下所示:

public class ExamDto 
{
    public int Id { get; set; }
    public long? CertificationId { get; set; }
    public string Name { get; set; } = null!;
    public long MinimumGrade { get; set; }
    public ExamCertDto Certificate { get; set; };
}

问题是请求对象必须完全匹配,这就是为什么必须Map它们的原因。否则不要使用对象,可以使用HttpContext.Current.Request属性。
仅供参考,您将需要在我提供的示例中进行额外的检查,否则它将不健壮。在添加之前检查考试和认证ID是否确实存在。

相关问题