Insert in 2 tables Entity framwork - 1 to 1

Asked

Viewed 181 times

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 data at once into the 2 entities?

Personal controller

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 Response) for those 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"
   }
}
  • But if you fill in the object of type person and the property user, when it applies the Entity Framework should already be inserted in the two tables.

  • I added the person controller to the question, how can I implement in it this is my problem:

1 answer

1


In this case you just fill the user object, and set the user object’s person property with the person object of the parameter, 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);
    }
  • OK Cassio, I’ll have lunch as soon as I get back I’ll try it out and if it works I’ll mark it as an answer

  • like you said: var usuario = new usuario&#xA; {&#xA; id = pessoa.id,&#xA; login = "gleyson",&#xA; senha = "123456",&#xA; ativo = "S"&#xA; };&#xA;&#xA; db.pessoa.Add(pessoa);&#xA; usuario.pessoa = pessoa;&#xA; db.usuario.Add(usuario);, but I set the values manually, how would I pass the user values to that controller in json for example, since the user fields do not appear in the person class? I don’t know if I’m being clear in this explanation.

  • for example I used json in soapui : {&#xA; "id": 2,&#xA; "tipo": "J",&#xA; "razao_social": "INTELIDER",&#xA; "nome_fantasia": "INTELIDER",&#xA; "cpf_cnpj": "0",&#xA; "rg_insc_estadual": "0"&#xA;}, how to enter also, through it, user data?

  • Yes, I told you to put it manually only as a test. Regarding there is, where will come the data to create the user object, will depend on your logic, do not know what logic you want to use, and where this data will come from.

  • Thanks for your help, I put up the example of how I implemented for someone who has the same question!

  • I’m glad it worked out.

Show 1 more comment

Browser other questions tagged

You are not signed in. Login or sign up in order to post.