Crud с Entity Framework - Как использовать Объем транзакции или context.Database.BeginTransactionn - PullRequest
0 голосов
/ 23 июня 2019

как использовать один TransactionScope или context.Database.BeginTransactionn в нескольких классах? Я использую Codesmith Tools для генерации классов с Entity Framework. При выполнении кода возникает следующая ошибка: экземпляр ObjectContext отброшен и больше не может использоваться для операций, требующих подключения. Я не могу создать одну транзакцию для использования обоими классами.

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)
            {
                using (TransactionScope Scope = new TransactionScope())
                {

                    Pessoa rngPessoa = new Pessoa(Context);

                    rngPessoa.Cadastrar(dtoPessoa);

                    dtoUsuario.CodigoPessoa = dtoPessoa.Codigo;

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

                    Scope.Complete();

                }
            }

            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 )
            {
                using (TransactionScope Scope = new TransactionScope())
                {
                    Context.Pessoa.AddObject(dtoPessoa);
                    Context.SaveChanges();

                    Scope.Complete();
                }
            }

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

    }
}
...