Добавление массива int в базу данных в Entity Framework Core - PullRequest
0 голосов
/ 09 июня 2019

Я хочу создать API, который может принимать любое количество дочерних идентификаторов. и зациклить его в базе данных, добавив 1 строку для каждого дочернего идентификатора. Я попытался сделать CategoryChildId списком или массивом, но он говорит, что платформа Entity не принимает примитивные типы.

Как мне этого добиться?

например, когда я получаю JSON, как это:

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

Он будет хранить его в базе данных следующим образом.

enter image description here

У меня есть только код для добавления одного ребенка за раз.

Сервис для контроллера:

 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Вам нужно понять, как работает EF ORM.

Немного переделаем ваш модуль.

Допустим, у вас есть

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

    // Now i assume that CategoryChildID refer to a list of CategoryRollup as children
    // then just make it so. you may have to config this in moduleBuilder 
    public List<CategoryRollup> CategoryChildren { get; set; }

    /// and this is the parent
    public CategoryRollup CategoryParent { get; set; }
}

Теперь ваша модель может выглядеть вот так, правда, она вам

public class CategoryRollupViewModel
{

    public CategoryRollupViewModel(CategoryRollup item){
      ID = item.ID;
      CategoryChildID = item.CategoryChildren.Select(x=> x.ID).ToList();
      CategoryParentID = item.CategoryParent?.ID; 
    }
    [Key]
    public int ID { get; set; }

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

    public int CategoryParentID { get; set; }

}

Правильно ли я вас понял?

0 голосов
/ 09 июня 2019

Пример 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();
    ...
}
...