如何在实体框架的 .Add() 中传递 DTO?

Posted

技术标签:

【中文标题】如何在实体框架的 .Add() 中传递 DTO?【英文标题】:How do I pass a DTO in .Add() of entity framework? 【发布时间】:2021-11-16 19:19:13 【问题描述】:

例如

我有一个实体

学生

ID, Name, DateCreated, GUID

学生DTO

Name, DateCreated

现在自动映射器

 CreateMap<students, studentsDTO>()
                .ForSourceMember(up=> up.ID, opt=> opt.Ignore())
                .ForSourceMember(up => up. GUID, opt=> opt.Ignore());

现在我有一个方法

public IHttpActionResult AddStudents(studentsDTO model)
        
            _context.Students.Add(model);
            return Ok();
        

但会抛出 model 类型与 Add 中的预期类型不匹配的错误。

我该如何解决?

【问题讨论】:

错误很明显。 students 是实际类型吗?在这种情况下,您需要将studentsDTO 映射到students,然后然后 将结果添加到_context.Students。简单配置 AutoMapper 并不意味着它会被使用 顺便说一句,实体名称应该是单数。你有一个学生,而不是一个学生 @PanagiotisKanavos,谢谢,但是该怎么做呢? 【参考方案1】:

您必须在添加之前将您的 DTO 映射到您的实体,如下所示:

public IHttpActionResult AddStudents(studentsDTO model)

    _context.Students.Add(_mapper.Map<Students>(model));
    return Ok();

【讨论】:

【参考方案2】:

确保您已通过控制器构造函数注入 AutoMapper:

private readonly IMapper _mapper;

public StudentsController(IMapper mapper)

    _mapper = mapper;

然后,您可以使用 AutoMapper 将 DTO 转换为实体模型。

public IHttpActionResult AddStudents(studentsDTO model)

       students students = _mapper.Map<Students>(model);
       _context.Students.Add(students);

       return Ok();
 

【讨论】:

以上是关于如何在实体框架的 .Add() 中传递 DTO?的主要内容,如果未能解决你的问题,请参考以下文章

将 WCF 服务与实体框架 4 和...DTO 一起使用?

(扫盲)DTO数据传输对象

使用 Automapper,将 DTO 映射回实体框架,包括引用的实体

OData $expand、DTO 和实体框架

将 DTO 转换为实体,反之亦然

如何创建从实体到 dto 的映射器,其中 dto 嵌套在哪里?