Как сделать вставку с объектами внутри объектов? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь сделать метод Post, используя Entity Framework. У меня есть объекты:

public class Pedido:BaseModel
    {
        public Pedido()
        {
        }

        public Pedido(List<PedidoItem> itens, double valorTotal, DateTime tempoTotal)
        {
            Id = 0;
            Itens = itens;
            ValorTotal = valorTotal;
            TempoTotal = tempoTotal;
        }

        public Pedido(int id, List<PedidoItem> itens, double valorTotal, DateTime tempoTotal)
        {
            Id = id;
            Itens = itens;
            ValorTotal = valorTotal;
            TempoTotal = tempoTotal;
        }

        public double ValorTotal { get; set; }
        public DateTime TempoTotal { get; set; }
        public List<PedidoItem> Itens { get; set; }

        public override BaseModel WithId(int id)
        {
            throw new System.NotImplementedException();
        }
    }

public class PedidoItem:BaseModel
    {
        public PedidoItem()
        {
        }

        public PedidoItem(int saborId, int tamanhoId, List<PedidoItemAdicional> adicionais)
        {
            Id = 0;
            SaborId = saborId;
            TamanhoId = tamanhoId;
            Adicionais = adicionais;
        }

        public PedidoItem(int id, int saborId, int tamanhoId, List<PedidoItemAdicional> adicionais)
        {
            Id = id;
            SaborId = saborId;
            TamanhoId = tamanhoId;
            Adicionais = adicionais;
        }

        [ForeignKey(nameof(Sabor))]
        public int SaborId { get; set; }
        public Sabor Sabor { get; set; }
        [ForeignKey(nameof(Tamanho))]
        public int TamanhoId { get; set; }
        public Tamanho Tamanho { get; set; }

        public List<PedidoItemAdicional> Adicionais;
        [ForeignKey(nameof(Pedido))]
        public int PedidoId { get; set; }

        public override BaseModel WithId(int id)
        {
            throw new System.NotImplementedException();
        }
    }

public class PedidoItemAdicional:BaseModel
    {

        public PedidoItemAdicional()
        {
        }

        public PedidoItemAdicional(int adicionalId, int pedidoItemId)
        {
            Id = 0;
            AdicionalId = adicionalId;
            PedidoItemId = pedidoItemId;
        }

        public PedidoItemAdicional(int id, int adicionalId, int pedidoItemId)
        {
            Id = id;
            AdicionalId = adicionalId;
            PedidoItemId = pedidoItemId;
        }

        [ForeignKey(nameof(Adicional))]
        public int AdicionalId { get; set; }
        public Adicional Adicional { get; set; }
        [ForeignKey(nameof(PedidoItem))]
        public int PedidoItemId { get; set; }
        public PedidoItem PedidoItem { get; set; }

        public override BaseModel WithId(int id)
        {
            throw new NotImplementedException();
        }
    }

public abstract class BaseModel
    {

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get;  set; }
        public abstract BaseModel WithId(int id);
    }

Я получаю JSON:

{
    "itens":[
        {
            "tamanhoid":1,
            "saborid":1,
            "adicionais":[
                {
                    "id":1
                },
                {
                    "id":2
                }
            ]
        }
    ]
}

Когда я вставляю в банк (добавить + сохранить) "pedido" и "pedidoItem" сохранены, но "pedidoItemAdicional" нет.

Для создания вставки я использую репозиторий:

public class PedidoRepository:BaseRepository<Pedido,DataContext>
    {
        public PedidoRepository(DataContext context):base(context)
        {

        }
    }
public abstract class BaseRepository<TEntity, TContext>
        where TEntity : BaseModel
        where TContext : DbContext
    {
        protected DbSet<TEntity> DbSet;
        protected TContext DbContext;

        protected BaseRepository(TContext dbContext)
        {
            DbContext = dbContext;
            DbSet = DbContext.Set<TEntity>();
        }

        public virtual async Task<List<TEntity>> Get
            (            
            Expression<Func<TEntity, object>> orderBy,
            bool asNoTracking = true,
            int take = 100
            )
        {
            var databaseCount = await DbSet.CountAsync().ConfigureAwait(false);
            if (asNoTracking)
                return await DbSet.AsNoTracking().OrderBy(orderBy).Take(take).ToListAsync().ConfigureAwait(false);


            return await DbSet.OrderBy(orderBy).Take(take).ToListAsync().ConfigureAwait(false);

        }

        public virtual async Task<List<TEntity>> Get
        (
            Expression<Func<TEntity, object>> orderBy,
            Expression<Func<TEntity, bool>> where,
            bool asNoTracking = true,
            int take = 100
        )
        {
            if (asNoTracking)
                return await DbSet.AsNoTracking().OrderBy(orderBy).Where(where).Take(take).ToListAsync()
                    .ConfigureAwait(false);

            return await DbSet.OrderBy(orderBy).Where(where).Take(take).ToListAsync()
             .ConfigureAwait(false);

        }

        public virtual async Task AddAsync(TEntity entity)
        {
            await DbSet.AddAsync(entity).ConfigureAwait(false);
        }

        public virtual Task UpdateAsync(TEntity entity)
        {
            DbSet.Update(entity);
            return Task.CompletedTask;
        }

        public virtual Task RemoveAsync(TEntity entity)
        {
            DbSet.Remove(entity);
            return Task.CompletedTask;
        }

        public virtual async Task SaveChangesAsync()
        {
            await DbContext.SaveChangesAsync().ConfigureAwait(false);
        }
    }


[HttpPost]
        [Route("")]
        public async Task<ActionResult<Response<Pedido>>> Insert(Pedido pedido)
        {
            await _repositoryPedido.AddAsync(obj);
            await _repositoryPedido.SaveChangesAsync();
            return null;
        }

Прием в порядке, "pedidoItemAdicional" получен, но не сохранен ... Я хотел бы сохранить его как с "pedidoItem".

1 Ответ

0 голосов
/ 31 марта 2020

Просто предположение, но я бы попытался изменить эту строку

   public List<PedidoItemAdicional> Adicionais;

в PedidoItem класса на

   public List<PedidoItemAdicional> Adicionais {get; set;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...