4
respostas

Relacionamento entre multiplos contextos

Olá, Como faço para que eu possa relacionar dados entre dois contextos diferentes, duas bases distintas que compartilham uma mesma informação? Pensei em fazer isto para dominar os relacionamentos entre bases, pois estou testando esse tipo de relacionado entre base master, com dados completos de clientes, e depois cada cliente com sua base individual, por questões de segurança. Nessa base individual eu coleto dados do cliente do cadastro realizado na base master.

4 respostas

Rafael, bom dia.

Você pode ter mais de uma classe de contexto em sua aplicação. No caso da segunda base, a string de conexão será montada somente após a identificação do cliente.

É isso que estava tentando esclarecer?

Fico no aguardo.

Olá Daniel. Exatamente isto. Meu context principal guardaria as informações globais de todos meus clientes e usuários da plataforma.

Após o login do cliente e validação, ele seria redirecionado para um context individual, onde acessaria as informações pertinentes a esse usuário/cliente.

No caso, para não haver duplicações, e por segurança nos cadastros, o ideal seria relacionar o context do cliente com o context global, principalmente nos quesitos cadastrais (Tipos de clientes, Tipos de código, Tipos X de qualquer coisa que é comum a qualquer cliente). Nessa situação específica que o Entity me diz que ele não consegue localizar as chaves em Contextos diferentes daquele carregado.

Rafael, coloca aqui o erro pra gente analisar, por favor.

Daniel, eu consegui realizar o relacionamento entre os contextos, eu estava a usar uma definição errada no modelo. Contudo, eu tive outro problema. O modelo do meu Contexto1 é criado no meu Context2.

Model Contexto1, que é o padrão do Entity.

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }

        public System.Data.Entity.DbSet<WCDA.Models.ConfigModels.B_CONFIG_TipoCliente> B_CONFIG_TipoCliente { get; set; }
        public System.Data.Entity.DbSet<WCDA.Models.B_CONFIG_Cliente> B_CONFIG_Cliente { get; set; }
        public System.Data.Entity.DbSet<WCDA.Models.ConfigModels.B_CONFIG_TipoBloco> B_CONFIG_TipoBloco { get; set; }
    }

O Model do Contexto1 que estou tentando relacionar com o Contexto2 é o "B_CONFIG_Cliente". No meu modelo ele cria a coleção para o modelo do Contexto2 "B_CAD_Cliente", a qual eu chamo de "_Cliente"

public virtual ICollection<B_CAD_Cliente> _Cliente { get; set; }

E meu modelo do Context2 segue com o código abaixo:

namespace WCDA.Models
{
    public class B_CAD_Cliente
    {
        [Key]
        public int CLILOCAL_ID { get; set; }

        public int CLI_ID { get; set; }

        public virtual B_CONFIG_Cliente _Cliente { get; set; }

    }
}

Recebo minha coleção enviada pelo Contexto1. O Contexto2 é definido desta forma:

public class WCDAContext : DbContext
{
    public WCDAContext() : base("name=WCDAContext")
    {
    }

    public System.Data.Entity.DbSet<WCDA.Models.B_CAD_Cliente> B_CAD_Cliente { get; set; }
}

Fiz as alterações no Controller para que ele chame o contexto correto no momento do select da Index, e deu certinho. No Create também ele consegue pegar o ID do Contexto1 sem problemas. Contudo, quando mando adicionar, ele dá erro de chave estrangeira e cria a tabela "B_CONFIG_Cliente do meu Context1 na base do Contexto2. Alguma coisa que devo fazer no Controller?

Meu Controller está abaixo, chamei de

        private WCDAContext db = new WCDAContext(); //Contexto2
        private ApplicationDbContext dbG = new ApplicationDbContext(); //Contexto1

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "CLILOCAL_ID,CLI_ID")] B_CAD_Cliente b_CAD_Cliente)
        {
            if (ModelState.IsValid)
            {
                db.B_CAD_Cliente.Add(b_CAD_Cliente);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.CLI_ID = new SelectList(dbG.B_CONFIG_Cliente, "CLI_ID", "CLI_RSOCIAL", b_CAD_Cliente.CLI_ID);
            return View(b_CAD_Cliente);
        }

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software