Insert into 2 tables Entity framwork - 1 to 1

1

I have two entities generated by the code-first wizard:

Person

 [Table("pessoa")]
    public partial class pessoa
    {
        public pessoa()
        {
            pessoa_endereco = new HashSet<pessoa_endereco>();
        }

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int id { get; set; }

        [Column(TypeName = "char")]
        [Required]
        [StringLength(1)]
        public string tipo { get; set; }

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

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

        [StringLength(14)]
        public string cpf_cnpj { get; set; }

        [StringLength(15)]
        public string rg_insc_estadual { get; set; }

        [JsonIgnore]
        public virtual administrador administrador { get; set; }
        [JsonIgnore]
        public virtual banco banco { get; set; }
        [JsonIgnore]
        public virtual cliente cliente { get; set; }
        [JsonIgnore]
        public virtual filial filial { get; set; }
        [JsonIgnore]
        public virtual fornecedor fornecedor { get; set; }
        [JsonIgnore]
        public virtual ICollection<pessoa_endereco> pessoa_endereco { get; set; }

        public virtual usuario usuario { get; set; }
        [JsonIgnore]
        public virtual vendedor vendedor { get; set; }
    }

User - Relationship 1 to 1 with person (person.id = user.id)

   [Table("usuario")]
    public partial class usuario
    {
        public usuario()
        {
            caixa = new HashSet<caixa>();
            pedido_venda = new HashSet<pedido_venda>();
            usuario_perfil = new HashSet<usuario_perfil>();
            usuario_permissao = new HashSet<usuario_permissao>();
        }

        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int id { get; set; }

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

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

        [Column(TypeName = "char")]
        [StringLength(1)]
        public string ativo { get; set; }

        [JsonIgnore]
        public virtual ICollection<caixa> caixa { get; set; }

        [JsonIgnore]
        public virtual ICollection<pedido_venda> pedido_venda { get; set; }

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

        [JsonIgnore]
        public virtual ICollection<usuario_perfil> usuario_perfil { get; set; }

        [JsonIgnore]
        public virtual ICollection<usuario_permissao> usuario_permissao { get; set; }
    }
}

I have 2 controllers dynamically created by the helper, with the Entity Framework. How do I create a Controller that inserts the data at once into the 2 entities?

Controller person

namespace WebApi.Controllers
{
    public class pessoasController : ApiController
    {
        private ModelTake db = new ModelTake();

        // GET: api/pessoas
        public IQueryable<pessoa> Getpessoa()
        {
            return db.pessoa;
        }

        // GET: api/pessoas/5
        [ResponseType(typeof(pessoa))]
        public IHttpActionResult Getpessoa(int id)
        {
            pessoa pessoa = db.pessoa.Find(id);
            if (pessoa == null)
            {
                return NotFound();
            }

            return Ok(pessoa);
        }

        // 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();
            }

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

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

            return StatusCode(HttpStatusCode.NoContent);
        }

        // POST: api/pessoas
        [ResponseType(typeof(pessoa))]
        public IHttpActionResult Postpessoa(pessoa pessoa)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.pessoa.Add(pessoa);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if (pessoaExists(pessoa.id))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("DefaultApi", new { id = pessoa.id }, pessoa);
        }

        // DELETE: api/pessoas/5
        [ResponseType(typeof(pessoa))]
        public IHttpActionResult Deletepessoa(int id)
        {
            pessoa pessoa = db.pessoa.Find(id);
            if (pessoa == null)
            {
                return NotFound();
            }

            db.pessoa.Remove(pessoa);
            db.SaveChanges();

            return Ok(pessoa);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool pessoaExists(int id)
        {
            return db.pessoa.Count(e => e.id == id) > 0;
        }
    }
}

Code added to the system (Cassio Answer) for anyone interested.

Controller:

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

Example json used to insert!

{
   "id": 4,
   "tipo": "J",
   "razao_social": "INTELIDER",
   "nome_fantasia": "INTELIDER",
   "cpf_cnpj": "0",
   "rg_insc_estadual": "0",
   "usuario":    {
      "id": 4,
      "login": "gleyson",
      "senha": "123456",
      "ativo": "S"
   }
}
    
asked by anonymous 10.06.2017 / 23:29

1 answer

1

In this case you simply populate the user object, and set the person property of the user object to the person's parameter object, and then just save.

// POST: api/pessoas
    [ResponseType(typeof(pessoa))]
    public IHttpActionResult Postpessoa(pessoa pessoa)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var usuario = new usuario{
            Login = "Preencha",
            Senha = "Preencha",
            ...
        };

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

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateException)
        {
            if (pessoaExists(pessoa.id))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtRoute("DefaultApi", new { id = pessoa.id }, pessoa);
    }
    
13.06.2017 / 16:11