Um aplicativo MVC 5 padrão vem com esse trecho de código no IdentityModels.cs - esse trecho de código é para todas as operações de identidade do ASP.NET para os modelos padrão:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Se eu estruturar um novo controlador usando visualizações com o Entity Framework e criar um "Novo contexto de dados ..." na caixa de diálogo, eu gero isso para mim:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
}
}
Se eu montar um outro controller + view usando EF, digamos, por exemplo, para um modelo Animal, essa nova linha seria gerada automaticamente logo abaixo public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
- assim:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
public System.Data.Entity.DbSet<WebApplication1.Models.Animal> Animals { get; set; }
}
}
ApplicationDbContext
(para todas as coisas de identidade do ASP.NET) herda da IdentityDbContext
qual, por sua vez, herda DbContext
.
AllOtherStuffDbContext
(para minhas próprias coisas) herda DbContext
.
Então, minha pergunta é:
Qual desses dois ( ApplicationDbContext
e AllOtherStuffDbContext
) devo usar para todos os meus outros modelos? Ou devo apenas usar o padrão gerado automaticamente, ApplicationDbContext
pois não deve ser um problema usá-lo, pois ele deriva da classe base DbContext
ou haverá alguma sobrecarga? Você deve usar apenas um DbContext
objeto no seu aplicativo para todos os seus modelos (já li isso em algum lugar), para que eu nem considere usar ambos ApplicationDbContext
e AllOtherStuffDbContext
em um único aplicativo? Ou qual é a melhor prática no MVC 5 com o ASP.NET Identity?
fonte
Respostas:
Eu usaria uma única classe Context herdada de IdentityDbContext. Dessa maneira, você pode ter o contexto ciente de quaisquer relações entre suas classes e o IdentityUser e as Funções do IdentityDbContext. Há muito pouca sobrecarga no IdentityDbContext, é basicamente um DbContext regular com dois DbSets. Um para os usuários e outro para as funções.
fonte
Há muita confusão sobre o IdentityDbContext , uma pesquisa rápida no Stackoverflow e você encontrará as seguintes perguntas:
" Por que o Asp.Net Identity IdentityDbContext é uma caixa preta?
Como posso alterar os nomes das tabelas ao usar o Visual Studio 2013 AspNet Identity?
Mesclar MyDbContext com IdentityDbContext "
Para responder a todas essas perguntas, precisamos entender que o IdentityDbContext é apenas uma classe herdada do DbContext.
Vamos dar uma olhada na fonte IdentityDbContext :
Com base no código fonte, se queremos mesclar IdentityDbContext com nosso DbContext, temos duas opções:
Primeira opção:
Crie um DbContext que herda de IdentityDbContext e tenha acesso às classes.
Notas Extra:
1) Também podemos alterar os nomes de tabela padrão da identidade do asp.net com a seguinte solução:
2) Além disso, podemos estender cada classe e adicionar qualquer propriedade a classes como 'IdentityUser', 'IdentityRole', ...
Para economizar tempo, podemos usar o modelo de projeto extensível do AspNet Identity 2.0 para estender todas as classes.
Segunda opçao:(Não recomendado)
Na verdade, não precisamos herdar o IdentityDbContext se escrevermos todo o código.
Então, basicamente, podemos herdar do DbContext e implementar nossa versão personalizada do "OnModelCreating (construtor ModelBuilder)" do código-fonte IdentityDbContext
fonte
Esta é uma entrada tardia para as pessoas, mas abaixo está minha implementação. Você também notará que eu eliminei a capacidade de alterar o tipo padrão das KEYs: os detalhes sobre os quais podem ser encontrados nos seguintes artigos:
NOTAS:
Observe que você não pode usar
Guid's
as chaves. Isso ocorre porque, sob o capô, eles sãoStruct
e, como tal, não têm unboxing, o que permitiria a conversão de um<TKey>
parâmetro genérico .AS CLASSES PARECEM COMO:
fonte
Se você pesquisar detalhadamente as abstrações do IdentityDbContext, verá que ele se parece com o seu DbContext derivado. A rota mais fácil é a resposta de Olav, mas se você quiser mais controle sobre o que está sendo criado e um pouco menos de dependência dos pacotes de identidade, dê uma olhada na minha pergunta e resposta aqui . Há um exemplo de código se você seguir o link, mas, em resumo, basta adicionar os DbSets necessários à sua própria subclasse DbContext.
fonte