首页 > 解决方案 > 如何将我从数据库中获得的实体绑定到我的请求的 DTO?

问题描述

我有一个 DTO(数据传输对象)类。也许这个类的名称不正确,但我通常将其称为请求模型或 DTO,并将数据从我的 JSON 请求映射到该类。我给你举个例子:

 public class SaveRequest
    {
        [JsonProperty("category_id")]
        [Required(ErrorMessage = "You have to choice category!!!")]
        public Category Category { get; set; }

        [JsonProperty("title")]
        [Required(ErrorMessage = "You have to type title!!!")]
        public string Title { get; set; }
    }

如您所见,我在这里有两个属性。一个 - 很简单Title- 只是一个字符串,但第二个 - 是我的数据库实体。对于这个项目,我使用 Entity Framework Core 和 .NET Core MVC 2.2。我将向您展示我的数据库上下文:

   public class ApplicationDbContext : IdentityDbContext
    {
        private readonly string _connectionString;

        public DbSet<Category> Category { get; set; }
        public DbSet<Application> Applications {get; set;}
        ... more props here ...

和类别模型的代码:

public class Category
    {
        public int CategoryId { get; set; }
        public string Name { get; set; }
        public DateTime CreatedAt { get; set; }
        public List<Application> Applications { get; set; }
        public Category()
        {
            CreatedAt = DateTime.UtcNow;
        }
    }

在控制器中,我有以下方法:

 public IActionResult Save([FromBody] SaveRequest request) {...}

如您所见,我在这里尝试捕捉SaveRequest模型。

所以,现在你知道我的代码了。这是关于我的问题。我发送以下 JSON:

{
  "title": "Hello!! How are you!!!",
  "category_id": 777
}

我想将category_id请求参数绑定到真正的CategoryEF 实体。我的意思是,让 EF 框架用给定的 id 找到我Category,然后将其绑定到CategoryDTO 类中的属性。如果Category具有给定 id 的实体不存在,则将新的模型错误添加到模型状态(以向客户端显示它)。如果存在,我希望将其绑定到我的 DTO。我已阅读此文档并看到了一些关于的内容[BindProperty],但我不明白它是否适合我的问题。

标签: c#.net-coreentity-framework-core

解决方案


实体框架无法自动执行此操作,我认为您可以构建自定义模型绑定器

但是,您可以在控制器中执行此操作

在 DTO

public class SaveRequest
    {
        [JsonProperty("category_id")]
        [Required(ErrorMessage = "You have to choise category!!!")]
        public int Category_ID { get; set; }

        [JsonProperty("title")]
        [Required(ErrorMessage = "You have to type title!!!")]
        public string Title { get; set; }
    } 

在你的控制器中

public IActionResult Save([FromBody] SaveRequest request) {

   var category = context.categories.where(c => c.id == request.Category_id).FirstOrDefaults();

   if(category == null) 
      return NotFound();
 ...
}

推荐阅读