首页 > 解决方案 > 在 Entity Framework Core 中将 int 数组添加到数据库

问题描述

我想制作一个可以接收任意数量子 ID 的 API。并在数据库中循环它,为每个子 ID 添加 1 行。我尝试将 CategoryChildId 设为列表或数组,但它说实体框架不接受原始类型。

我怎样才能做到这一点?

例如,当我收到这样的 json 时:

"CategoryParentID": "4",
"CategoryChildID": [
    {
      5,6,7
    }
  ],

它将像这样将其存储在数据库中。

在此处输入图像描述

我只有一次添加单个孩子的代码。

控制器的服务:

 public async Task<ServiceResultWithoutBaseEntity<CategoryRollup>> Add(CategoryRollupViewModel newItem)
{
    var result = new ServiceResultWithoutBaseEntity<CategoryRollup>();
    result.Errors.AddRange(Validate(newItem));

    if (result.HasErrors)
        return result;

    var item = newItem.MapToEntity(new CategoryRollup());

    _context.CategoryRollups.Add(item);
    await _context.SaveChangesAsync();

    result.EntityResult = item;

    return result;
}

模型:

    public class CategoryRollup
{
    [Key]
    public int ID { get; set; }

    public int CategoryChildID { get; set; }

    public int CategoryParentID { get; set; }
}

查看模型:

public class CategoryRollupViewModel
{
    [Key]
    public int ID { get; set; }

    public int CategoryChildID { get; set; }

    public int CategoryParentID { get; set; }

}

帮手:

  public static class CategoryRollupHelper
{
    public static CategoryRollupViewModel MapFromEntity(this CategoryRollup source)
    {
        if (source == null)
            return null;

        var result = new CategoryRollupViewModel
        {
            CategoryChildID = source.CategoryChildID,
            CategoryParentID = source.CategoryParentID,
        };

        return result;
    }

    public static CategoryRollup MapToEntity(this CategoryRollupViewModel source, CategoryRollup entity)
    {
        if (source == null || entity == null)
            return null;

        entity.CategoryChildID = source.CategoryChildID;
        entity.CategoryParentID = source.CategoryParentID;

        return entity;
    }
}

标签: c#entity-frameworkapi

解决方案


JSON 示例无效。必须包含一个CategoryChildID整数数组(删除{})。

让我们假设 JSON 具有以下结构:

"CategoryParentID": "4",
"CategoryChildID": [5,6,7]

这意味着您的视图模型应该包含两个属性(创建新类)

public class CategoryRollupViewModelV2
{

    public List<int> CategoryChildID { get; set; }

    public int CategoryParentID { get; set; }

}

将您的控制器代码更改为:

public async Task<ServiceResultWithoutBaseEntity<CategoryRollup>> Add(CategoryRollupViewModelV2 newItem)
{
    ...
    foreach(var categoryChildId in newItem.CategoryChildID)
    {
       var categoryRollupEntity = new CategoryRollup
       {
           CategoryParentID = newItem.CategoryParentID,
           CategoryChildID = categoryChildId
       }
       _context.CategoryRollups.Add(categoryRollupEntity);
    }
    await _context.SaveChangesAsync();
    ...
}

推荐阅读