Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

CRUD com Entity Framework - Transações

Qual a melhor maneira de implementar as classes que exemplifiquei para que a gravação de dados de Pessoa e Usuário fosse transacionada? Tudo que está dentro de um Context já funciona transacionado eo o commit seria no SaveChanges, porém nas classes que mostrei onde colocaria o SaveChanges() para gravar os dados das duas classes e aproveitando um único context?

using Sivisam.Data;
    using PagedList;

    using System;
    using System.Collections.Generic;
    using System.Linq;

    using System.Transactions;
    using Newtonsoft.Json;
    using Sivisam.Dto.Seguranca;

    namespace Sivisam.Rng.Seguranca
    {

        public class Usuario
        {
            public SivisamDataContext Context;

            public Usuario()
            {
                Context = new SivisamDataContext();
            }

            public Usuario(SivisamDataContext pContext)
            {
                Context = pContext;
            }


            public Data.Usuario Cadastrar(Data.Usuario dtoUsuario, Data.Pessoa 
             dtoPessoa)
            {

                using (Context)
                {


                        Pessoa rngPessoa = new Pessoa(Context);

                        rngPessoa.Cadastrar(dtoPessoa);

                        dtoUsuario.CodigoPessoa = dtoPessoa.Codigo;

                        Context.Usuario.AddObject(dtoUsuario);
                        Context.SaveChanges();

                }

                return dtoUsuario;

            }

        }

    }

    using Sivisam.Data;
    using PagedList;

    using System;
    using System.Collections.Generic;
    using System.Linq;

    using System.Transactions;
    using Newtonsoft.Json;
    using Sivisam.Dto.Seguranca;

    namespace Sivisam.Rng.Seguranca
    {
        public class Pessoa
        {
            public SivisamDataContext Context;

            public Pessoa()
            {
                Context = new SivisamDataContext();
            }

            public Pessoa(SivisamDataContext pContext)
            {
                Context = pContext;
            }

            public virtual Data.Pessoa Cadastrar(Data.Pessoa dtoPessoa)
            {

                using ( Context )
                {

                        Context.Pessoa.AddObject(dtoPessoa);
                        Context.SaveChanges();

                }

                return dtoPessoa;

            }

        }
    }



    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Security;
    using Sivisam.Rng;


    namespace Sivisam.Web.Controllers
    {
        public class DefaultController : Sivisam.Web.Controllers.Base
        {        

            public ActionResult CadastrarUsuario()
            {
                Rng.Seguranca.Usuario rngUsuario = new Rng.Seguranca.Usuario();

                Data.Pessoa DataPessoa = new Data.Pessoa();
                DataPessoa.Cep = "21212212";
                DataPessoa.CodigoCidade = 1;
                DataPessoa.ComplementoEndereco = "";
                DataPessoa.Cpf = "66762251543";
                DataPessoa.DataNascimento = DateTime.Now;
                DataPessoa.EmissorRg = "sspba";
                DataPessoa.Endereco = "snf dklashdklfaslkgdask";
                DataPessoa.Nome = "nfdl akshfkahs";
                DataPessoa.NumeroEndereco = "111";
                DataPessoa.ReferenciaEndereco = "ewqeqwe";
                DataPessoa.Rg = "0243552634";
                DataPessoa.TelefoneCelular = "75899897867";
                DataPessoa.TelefoneResidencial = "75899897867";

                Data.Usuario DataUsuario = new Data.Usuario();
                DataUsuario.Ativo = 1;
                DataUsuario.DataHoraCadastro = DateTime.Now;
                DataUsuario.EhServidor = 1;
                DataUsuario.Email = "lucas@gmail.com";
                DataUsuario.Hash = "zvczxvzv";
                DataUsuario.IpCadastro = "1.1.1.1";

                rngUsuario.Cadastrar(DataUsuario, DataPessoa);


                return View();
            }

        }
    }
1 resposta

Todo contexto de banco de dados, no entty frameworks, já "encapsula" uma transação. Caso queria deixar isso explicito recomendo fazer as alterações iniciando com Context.Database.BeginTransaction() e finalizando com transaction.Commit() em caso de sucesso ou transaction.Rollback(); em caso de erro, como no exemplo de código abaixo tirado de https://www.entityframeworktutorial.net/entityframework6/transaction-in-entity-framework.aspx

using (var context = new SchoolContext())
{
    context.Database.Log = Console.Write;

    using (DbContextTransaction transaction = context.Database.BeginTransaction())
    {
        try
        {
            var standard = context.Standards.Add(new Standard() { StandardName = "1st Grade" });

            context.Students.Add(new Student()
            {
                FirstName = "Rama2",
                StandardId = standard.StandardId
            });
            context.SaveChanges();

            context.Courses.Add(new Course() { CourseName = "Computer Science" });
            context.SaveChanges();

            transaction.Commit();
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            Console.WriteLine("Error occurred.");
        }
    }
}