ICollection in Put WebApi method

1

I have the Put method in a WebApi Rest service

        // PUT: api/pessoas/5
        [ResponseType(typeof(void))]
        public IHttpActionResult Putpessoa(int id, pessoa pessoa)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != pessoa.id)
            {
                return BadRequest();
            }

            //exibição dos itens da entidade usuario
            var usuario = new usuario
            {
                id = pessoa.id,
                login = pessoa.usuario.login,
                senha = pessoa.usuario.senha,
                ativo = pessoa.usuario.ativo
            };

            db.pessoa.Add(pessoa);
            usuario.pessoa = pessoa;
            db.usuario.Add(usuario);


        db.Entry(pessoa).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!pessoaExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return StatusCode(HttpStatusCode.NoContent);
        }

Class personas_endereco

namespace WebApi.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
    using Newtonsoft.Json;

    [Table("pessoa_endereco")]
    public partial class pessoa_endereco
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int id { get; set; }

        public int pessoa_id { get; set; }

        [Required]
        [StringLength(100)]
        public string logradouro { get; set; }

        [StringLength(20)]
        public string numero { get; set; }

        [StringLength(50)]
        public string complemento { get; set; }

        [StringLength(50)]
        public string ponto_referencia { get; set; }

        [Required]
        [StringLength(8)]
        public string cep { get; set; }

        [StringLength(50)]
        public string bairro { get; set; }

        [StringLength(100)]
        public string nome_contato { get; set; }

        [StringLength(20)]
        public string telefone_1 { get; set; }

        [Required]
        [StringLength(10)]
        public string ramal_telefone_1 { get; set; }

        [StringLength(20)]
        public string telefone_2 { get; set; }

        [Required]
        [StringLength(10)]
        public string ramal_telefone_2 { get; set; }

        [StringLength(20)]
        public string celular { get; set; }

        [StringLength(100)]
        public string email { get; set; }

        [JsonIgnore]
        public virtual pessoa pessoa { get; set; }
    }
}

It is working, but I need to add another relationship with another entity called person_endereco, similar to the relationship of the user entity. The problem is that user is 1 for 1 and persona_endereco is 1 (person) for many (persona_endereco).

 //relacionamento de pessoa com entidade usuario
 public virtual usuario usuario { get; set; }

 //relacionamento de pessoa com entidade pessoa_endereco
 public virtual ICollection<pessoa_endereco> pessoa_endereco { get; set; }

I tried to do the same as user but it does not work:

var pessoa_endereco = new pessoa_endereco
{
      id = pessoa.id,
      logradouro = pessoa.pessoa_endereco.logradouro
};

The error appears:

Can not implicitly convert type "System.Collections.Generic.ICollection" to "string" WebApi

But if you do:

 var pessoa_endereco = new pessoa_endereco
    {
          id = pessoa.id,
          logradouro = 'rua teste'
    };

By writing directly it works. But what I need is to get the values coming from the json that was sent to this post.

I solved the problem by following the instructions of Cassio, I did not have to move in the classes just to add in the controler, in the PUT and POST method the code:

var person_endereco1 = new person_endereco ();

        foreach (var pessoa_endereco in pessoa.pessoa_endereco)
        {
            pessoa_id = pessoa.id;
            logradouro = pessoa_endereco.logradouro;
            cep = pessoa_endereco.cep;
            ramal_telefone_1 = pessoa_endereco.ramal_telefone_1;
            ramal_telefone_2 = pessoa_endereco.ramal_telefone_1;

            pessoa_endereco1 = pessoa_endereco;
        };

        db.pessoa.Add(pessoa);
        pessoa_endereco1.pessoa = pessoa;
        db.pessoa_endereco.Add(pessoa_endereco1);
    
asked by anonymous 28.06.2017 / 12:38

1 answer

1

I think you should change your relationship to:

Person

class pessoa
{
    public pessoa() 
    {
        pessoa_endereco = new List<pessoa_endereco>();
    }

    public string codigo { get; set; }
    public string nome { get; set; }
    public ICollection<pessoa_endereco> pessoa_endereco { get; set; }
}

Person_Endereco

class pessoa_endereco
{   
    public pessoa_endereco() { }

    public string codigo { get; set; }
    public string logradouro { get; set; }
    public virtual pessoa pessoa { get; set; }

}

Main

public static void Main()
{

    var pessoa_endereco  = new pessoa_endereco(){
        codigo = "1",
        logradouro = "rua 1"
    };

    var pessoa2 = new pessoa
    {
        codigo = "2",
        nome = "cassio"
    };

    pessoa2.pessoa_endereco.Add(pessoa_endereco);


    foreach (var item in pessoa2.pessoa_endereco)
    {
        Console.WriteLine(item.logradouro);
    }
}

In your Function Putpessoa you use your logic.

Sample link: link

    
28.06.2017 / 18:41