繁体   English   中英

如何使用 EF 内核在 Asp.net 内核 web API 中保存相关模型中的数据?

[英]How to save Data in Related Models in Asp.net core web API using EF core?

我在将数据保存到相关 model 中时遇到问题 asp.net 核心 web ZDB974238714CA8DE634A7A7CED 和 D08DE634A7ACED 核心我有一个产品model和类别model,一个类别可以有很多产品但一个产品只能属于一个类别

 public class Product
    {
        [Key]
        [Required]
        public int ProductId { get; set; }
        [Required]
        public string Title { get; set; }
        [Required]
        public Double Price { get; set; }
        [Required]
        public Category Category { get; set; }

        [Required]
        public string Desc { get; set; }

        [Required]
        public string Absolute_Url { get; set; }

        [Required]
        public DateTime PostDate { get; set; }
    }
public class Category
    {
        [Key]
        [Required]
        public int CategoryId { get; set; }
        [Required]
        public string? Name { get; set; }

        
    }

我有一个产品 DTO model

public class ProductDTO
    {
        [Required]
        public string Title { get; set; }
        [Required]
        public Double Price { get; set; }
        [Required]
        public int CategoryId { get; set; }

        [Required]
        public string Desc { get; set; }

        
    }

我的逻辑是,当我使用 Product DTO model 发布数据时,我使用发布的 CategoryId 来获取类别,然后在保存之前更新 Product Model。 我保存后,产品model中的Category为null,如下图。

[
  {
    "productId": 3,
    "title": "Swagger Test",
    "price": 20,
    "category": null,
    "desc": "Swagger Test",
    "absolute_Url": "Christian/Swagger Test",
    "postDate": "2022-07-15T13:18:42.0060792"
  }
]

这是我的 controller 方法

[HttpPost("Create")]
        public async Task<ActionResult> Create([FromBody] ProductDTO productDTO)
        {
            if (productDTO == null)
            {
                return BadRequest();
            }
            if (!ModelState.IsValid)
            {
                return BadRequest();
            }

            try
            {
                //get product category
                var category = await _uow.Category.FindById(productDTO.CategoryId);

                if(category == null)
                {
                    return BadRequest();
                }
                var product = _mapper.Map<Product>(productDTO);

                product.Category = category;
                product.PostDate = DateTime.Now;
                product.Absolute_Url = $"{category.Name}/{product.Title}";

               
                _uow.Product.Create(product);
                await _uow.Save();
                return Ok();
            }
            catch (Exception)
            {
                return BadRequest();
            }

        }

请帮助

因此,如果我正确理解了这个问题,您可以执行以下操作:

public class Product
{
    [Key]
    [Required]
    public int ProductId { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public Double Price { get; set; }
    [Required]
    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }

    [Required]
    public string Desc { get; set; }

    [Required]
    public string Absolute_Url { get; set; }

    [Required]
    public DateTime PostDate { get; set; }
}

所以请注意我刚刚添加了类别 ID,然后将虚拟添加到您的类别实体中。 因此,根据我的经验,EF Core 现在知道将您的类别 ID 与您的类别实体相关联。 因此无需在类别数据库中搜索该 ID,只需使用类别 ID 保存您的产品。

当您现在将该实体从数据库中拉出时,如果您告诉您 Response DTO 包含 CategoryDTO public CategoryDto Category { get; set; } ,它将与它一起拉出类别实体。 public CategoryDto Category { get; set; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM