none
Relacionamento entre 2 Bases com o EF + CodeFirst RRS feed

  • Pergunta

  • Pessoal, bom dia!

    Estou com uma grande dificuldade. Já procurei em diversos lugares e não encontrei uma solução.

    Eu tenho um projeto que deve conectar com 2 bases. Não sei como que eu faço para relacionar as tabelas de bases distintas no CodeFirst. Exemplo:

    Base: Corporativo
    Tabela: Cargo
    Colunas: CargoId, Descricao

    Base: Sistema
    Tabela: Pessoa
    Coluna: PessoaId, Nome, CargoID(Essa coluna, deve comunicar com a tabela "Cargo" da base "Corporativo")

    Como deve funcionar a relação entre os Modelos e os Contexto.

    No aguardo e muito obrigado.

    segunda-feira, 26 de outubro de 2015 11:33

Respostas

  • Na verdade Thauan, são contextos/bases diferentes. Vc não consegue estabelecer uma relação direta entre eles, então a consistência deste tipo de coisa e mesmo consulta juntando as duas bases fica a cargo da sua aplicação.

    Uma alternativa seria vc criar uma Views em um banco, por exemplo, de forma a apontar para os dados que estão na outra base. Com isso vc conseguiria fazer essa "amarração".

    • Sugerido como Resposta JAlvez42 segunda-feira, 26 de outubro de 2015 12:30
    • Marcado como Resposta Thauan Ricardo segunda-feira, 26 de outubro de 2015 17:12
    segunda-feira, 26 de outubro de 2015 12:17

Todas as Respostas

  • Na verdade Thauan, são contextos/bases diferentes. Vc não consegue estabelecer uma relação direta entre eles, então a consistência deste tipo de coisa e mesmo consulta juntando as duas bases fica a cargo da sua aplicação.

    Uma alternativa seria vc criar uma Views em um banco, por exemplo, de forma a apontar para os dados que estão na outra base. Com isso vc conseguiria fazer essa "amarração".

    • Sugerido como Resposta JAlvez42 segunda-feira, 26 de outubro de 2015 12:30
    • Marcado como Resposta Thauan Ricardo segunda-feira, 26 de outubro de 2015 17:12
    segunda-feira, 26 de outubro de 2015 12:17
  • Renato, muito obrigado.

    Então, sempre nesse caso, devemos sempre utilizar Views??

    Como faço pra fazer alteração, inserção no caso em outra base? 

    No meu projeto devo criar 2 context,um pra cada base e assim fazer a alteração em cada uma delas?

    Como eu exibo a view em um Modelo para trabalhar no projeto?

    Desculpe, estou a procura faz tempo de uma solução.

    segunda-feira, 26 de outubro de 2015 13:24
  • Em se tratando de outra base, entendo que o ideal seria vc implementar procedures para isso e referenciar as mesmas como métodos da sua entidade. Ainda não fiz nada do tipo, mas tentaria resolver desta maneira que te passei.
    segunda-feira, 26 de outubro de 2015 16:09
  • Renato,
    Fiz algo muito simples, sem implementar o UnitOfWork.

    Resolvi da seguinte maneira:

    Criei 2 Context:

    CorporativoContext:

    namespace WebApplication1.Context
    {
        public class CorporativoContext : DbContext
        {
            public DbSet<Cargo> Cargos { get; set; }
    
            public CorporativoContext()
                : base("CorporativoConnectionString")
            {
    
            }
        }
    }

    ThauanContext:

     public class ThauanContext : DbContext
        {
            public DbSet<Pessoa> Pessoas { get; set; }
            public DbSet<vwtPessoa> vwtPessoa { get; set; }
    
            public ThauanContext()
                : base("ThauanConnectionString")
            {
    
            }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<vwtPessoa>().ToTable("vwtPessoa");
                base.OnModelCreating(modelBuilder);
            }
        }

    Meus Modelos:

    Models/Views/vwtPessoa.cs:

        public class vwtPessoa
        {
            [Key]
            public int PESS_CD_ID { get; set; }
            public string PESS_NM_COMPLETO { get; set; }
            public int CARG_CD_ID { get; set; }
            public string CARG_DS_COMPLETO { get; set; }
        }

    Models/Cargo.cs:

        [Table("TB_CARGO")]
        public class Cargo
        {
            [Column("CARG_CD_ID")]
            public int CargoId { get; set; }
    
            [Column("CARG_DS_COMPLETO")]
            public string Descricao { get; set; }
        }

    Models/Pessoa.cs:

        [Table("TB_PESSOA")]
        public class Pessoa
        {
            [Column("PESS_CD_ID")]
            public int PessoaId { get; set; }
    
            [Column("PESS_NM_COMPLETO")]
            public string NomeCompleto { get; set; }
    
            [Column("CARG_CD_ID")]
            public int CargoId { get; set; }
        }

    PessoaController:

    public class PessoaController : Controller
        {
            //
            // GET: /Pessoa/
            public ActionResult Index()
            {
                using (var thauanContext = new ThauanContext())
                {                
                    IEnumerable<vwtPessoa> ltsPessoa = thauanContext.vwtPessoa.ToList().Take(5);
                    return View(ltsPessoa);
                }
            }
    
            //
            // GET: /Pessoa/Cadastrar
            public ActionResult Cadastrar()
            {
                using (var corporativoContext = new CorporativoContext())
                {
                    ViewBag.Cargos = new SelectList(corporativoContext.Cargos.ToList(), "CargoId", "Descricao");
                }
    
                return View();
            }
    
            //
            // POST: /Pessoa/Cadastrar
            [HttpPost]
            public ActionResult Cadastrar(Pessoa cPessoa)
            {
                if (ModelState.IsValid)
                {
                    using (var thauanContext = new ThauanContext())
                    {
                        thauanContext.Pessoas.Add(cPessoa);
                        thauanContext.SaveChanges();
    
                        return RedirectToAction("Index");
                    }
                }
    
                using (var corporativoContext = new CorporativoContext())
                {
                    ViewBag.Cargos = new SelectList(corporativoContext.Cargos.ToList(), "CargoId", "Descricao");
                }
                return View(cPessoa);
            }
    
            //
            // GET: /Pessoa/Editar
            public ActionResult Editar(int? Id)
            {
                if (Id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                using (var context = new ThauanContext())
                {
                    var cPessoa = context.Pessoas.Find(Id);
    
                    if (cPessoa == null)
                    {
                        return HttpNotFound();
                    }
                }
                
                return View();
            }
        }

    Resolvi postar o que eu fiz, para ajudar as pessoas que possuem dúvida.
    O que você acha dessa solução?

    Se possível, tem a possibilidade de você compartilhar algo relacionado a essa ideia de implementação com procedures e referenciar como métodos da entidade para ter uma noção?

    Provavelmente, muitas pessoas devem ter essa mesma dúvida, relacionamento entre as tabelas de Bases.

    Agradeço. Muito obrigado!

    segunda-feira, 26 de outubro de 2015 17:06
  • Opa Thauan, boa sugestão. Assim que sobrar um tempo vou tentar escrever um post a respeito.
    segunda-feira, 26 de outubro de 2015 18:33