5
respostas

Duvida sobre utilização do IdentityDbContext

Pessoal, boa tarde.

Estou com algumas duvidas relacionadas a qual context usar.

No curso o professor utilizou dois DbContext diferentes um no projeto de filmes e outro no projeto de usuarios, que nesse caso é o IdentityDbContext, a minha duvida seria, eu posso utilizar o IdentityDbContext no projeto de filmes sem problema nenhum ou o utilizo apenas para casos de gerenciamento de usuarios?

Caso sim, nesse caso não seria necessario criar um outro projeto, mas iria contra o principio de manter as responsabilidades separadas que o professor mencionou na aula, mas caso não possa ou não seja uma boa abordagem manter tudo em um unico DbContext, isso me gera uma outra duvida, que no caso seria como fazer o relacionamento entre as tabelas?

Ex: Ter uma tabela na base de dados que relaciona os usuarios com os filmes que ela ja assistiu.

Eu poderia nos dois projetos referenciar ao mesmo banco atraves da connection string ou daria algum problema por um usar o IdentityDbContext e o outro não? Pois no exemplo acima o relacionamento não seria possivel pois as tabelas estão em bancos e DbContext diferentes.

Quem puder me ajudar com essas duvidas ficaria agradecido!

5 respostas

Olá Renny Gomes Braz, Espero que esteja tudo bem contigo.

Bom, tentando responder a tua pergunta, Nos projectos desenvolvidos no curso o professor apresentou-nos dois DbContext (IdentityDbContext e DbContext), o DbContext em si é uma classe especifica do EntityFrameworkCore.DbContext, essa classe representa a conexão com o banco de dados a ser usada, já o IdentityDbContext é uma classe especifica para ser usada quando pretende-se fazer p uso dos recursos de gerenciamento de usuários, essa classe extende/herda as propriedades da classe DbContext.

Se não tivessemos que separar os projectos poderiamos usar o IdentityDbContext para cuidar da conexão com a base de dados do projecto completo sem problemas nenhum, visto que IdentityDbContext herda de DbContext e tem suas próprias classes para controle de usuário imbutida, mas como pretende-se separar as responsabilidades de cada aplicação, então isolamos a aplicação para gerenciamento de usuários em um projecto separado e o mesmo pode ser usado para gerenciar diversas aplicações que precisam fazer controle de acesso. Neste cenário faz-se sentir o conceito de Miroserviços.

Se precisares de uma aplicação que não pretendes ter um controle de usuários custumizado do pacote Microsoft.AspNetCore.Identity.EntityFrameworkCore então usa o DbContext, pois nela terás simplesmente as classes ou models que criares.

Nos dois projectos podes usar o mesmo banco de dados mas o aconselhavel é ter os bancos de dados separados e caso precisares de fazer relacionamento entre as entidades então crie uma class (Model) específico simplesmente com os campos que a tua aplicação necessita para fazer o relacionamento.

Expero ter ajudado. e caso queira aprender mais sobre interação entre aplicações separadas super recomendo a dar uma olhada na arquitetura de Microserviços.

Bom dia Dércio.

Obrigado pela resposta, irei dar uma olhada a arquitetura de microserviços como você sugeriu, mas uma duvida que fiquei em relação a sua reposta seria a seguinte:

No caso então eu teria duas classes usuários certo? Dessa forma, a classe usuário no IdentityDbContext seria justamente só para realizar o gerenciamento de usuários enquanto que a classe usuário no DbContext seria para realizar o relacionamento com as outras tabelas, mas se eu fizer dessa forma ao fazer o cadastro de um novo usuário eu terei que fazer o registro nas tabelas nos dois DbContext e garantir que seus ID's sejam iguais nas duas tabelas, pois caso o contrario se eu realizar um login e os ID's forem diferentes, pode ocorre de eu ter a autorização de acesso, mas acessar informações de outro usuário devido ao ID diferente, ou não conseguir encontrar as informações pela chance de não ter um usuário com aquele ID na tabela no DbContext.

Nesse caso então terei que fazer dessa forma ou teria outra?

Mas uma vez obrigado pela resposta.

Se tiveres dois projectos separados então terás dois DBContext, caso for simplesmente um projecto ai só usarás um DBContex e uma classe de usuário responsável para pegar as informações do usuário no banco de dados. Se estiveres fazendo um projecto único com toda logia de controle de usuários e a logica de gerenciamento de filmes em um cinema por exemplo podes usar o IdentityDBContext e quiseres relacionar a classe de usuários do identity com uma outra classe no teu projecto então poderias criar uma ctua própria classe de usuário para tua aplicação e a mesma terá de herdar as propriedades de IdentityUser.

Nesta imagem criei uma classe User que herdou da classe IdentityUser, desse jeito tenho a possibilidade de adicionar mais campos que eu quiser para minha aplicação.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Aqui tenho uma class Account que tem a chave primaria da tabela User.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Aqui tenho um projecto que faz o uso do Identity para gerenciamento de usuários e alem disso tenho a regra de negócios para uma livraria. https://github.com/derciosinione/book-store-api

Espero ter ajudado. Qualquer dúvidas não exita em perguntar.