Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Dúvida sobre Identity 2

Bem, vendo a pergunta realizada anteriormente sobre como proceder caso a aplicação já tenha um contexto herdando de DBContext, nasceu outra dúvida aqui:

Tenho um contexto que hoje herda de DBContext e o alterei para que herdasse de IdentityDbContext, porém neste contexto eu tinha mapeado como DbSet o modelo Usuario (Que são os usuários que vão se registrar), este mapeamento continua?

 public class Contexto : IdentityDbContext<Usuario>
    {
        public DbSet<ItemPedido> ItensPedido { get; set; }
        public DbSet<Produto> Produtos { get; set; }
        public DbSet<Curso> Cursos { get; set; }
        public DbSet<Usuario> Usuarios { get; set; }

        public Contexto(DbContextOptions<Contexto> options) : base(options) { }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new ProdutoConfiguration());
            modelBuilder.ApplyConfiguration(new CursoConfiguration());
            modelBuilder.ApplyConfiguration(new UsuarioConfiguration());

        }
    }

E além disso havia criado uma configuração no OnModelCreating para usuário... mantenho ela intacta?

Obg!

7 respostas

Olá, Marco.

Seu tipo Usuario herda a classe IdentityUser? Criarei uma prova de conceito aqui na minha máquina para lhe responder com mais propriedade!

Abs.

Sim, o Usuario herda IdentityUser

Acredito que a configuração não permaneça como está, quando tento migrar do jeito que está recebo a mensagem:

The entity type 'IdentityUserLogin' requires a primary key to be defined.

Creio que a config de usuário vá mudar.

Aqui a configuração de Usuário

internal class UsuarioConfiguration : IEntityTypeConfiguration<Usuario>
    {
        public virtual void Configure(EntityTypeBuilder<Usuario> builder)
        {
            builder
                .Property(u => u.Senha)
                .IsRequired();

            builder
                .Property(u => u.Email)
                .HasMaxLength(45)
                .IsRequired();

            builder
                .Property(u => u.Instituicao)
                .IsRequired();

            builder
               .Property(u => u.InstituicaoSigla);

            builder
                .Property(u => u.Ra)
                .HasMaxLength(25);
        }
    }

E aqui o modelo de Usuário

 public class Usuario : IdentityUser
    {
        public string Ra { get; private set; }
        public string Senha { get; private set; }   
        public string Instituicao { get; private set; }
        public string InstituicaoSigla { get; private set; }
        public TipoUsuario TipoUsuario { get; private set; }

        public Usuario() { }

Se conseguir me dar uma direção nessa.... pensei em criar contextos separados, mas acho que manter um só seria possível, mas creio que estou deixando passar algo...

Olá, Marco. Desculpe a demora em responder, só agora consegui sentar para reproduzir em minha máquina. Vou criar o projeto agora e o mantenho atualizado.

Abraços.

solução!

Marco,

No método OnModelCreating da sua classe Contexto, faça uma chamada pra a implementação da classe base, desta forma:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    modelBuilder.ApplyConfiguration(new ProdutoConfiguration());
    modelBuilder.ApplyConfiguration(new CursoConfiguration());
    modelBuilder.ApplyConfiguration(new UsuarioConfiguration());
}

A chamada para a implementação da classe base deverá fazer o mapeamento para todos os DbSets de seu contexto (inclusive os que estão definidos em IdentityDbContext<Usuario>).

Depois disto, as chamadas para modelBuilder.ApplyConfiguration realizarão suas configurações específicas e, caso haja algum conflito com o que foi criado por model.OnModelCreating, suas configurações irão sobrescrever o que foi feito pela classe base. Sempre adicione suas customizações depois de chamar base.OnModelCreating(builder).

Deu certo?

Abs.

Deu certo Guilherme, vlw mano!!!