É possível usar a nova identidade Asp.net com Database First e EDMX? Ou apenas com o código primeiro?
Aqui está o que eu fiz:
1) Fiz um novo projeto MVC5 e fiz com que a nova identidade criasse as novas tabelas de usuário e funções em meu banco de dados.
2) Em seguida, abri meu arquivo EDMX do Database First e arrastei para a nova tabela Identity Users, pois tenho outras tabelas relacionadas a ela.
3) Ao salvar o EDMX, o gerador POCO do Database First criará automaticamente uma classe de usuário. No entanto, UserManager e RoleManager esperam que uma classe User herde do novo namespace Identity (Microsoft.AspNet.Identity.IUser), portanto, usar a classe POCO User não funcionará.
Eu acho que uma solução possível é editar minhas classes de geração de POCO para que minha classe de usuário herde de IUser?
Ou a identidade do ASP.NET é compatível apenas com o Code First Design?
+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++
Atualização: Seguindo a sugestão de Anders Abel abaixo, foi o que fiz. Funciona, mas gostaria de saber se existe uma solução mais elegante.
1) Eu estendi minha classe de usuário de entidade criando uma classe parcial dentro do mesmo namespace que minhas entidades geradas automaticamente.
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
2) Mudei meu DataContext para herdar de IdentityDBContext em vez de DBContext. Observe que toda vez que você atualiza seu EDMX e regenera as classes DBContext e Entity, você terá que definir isso novamente.
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
3) Em sua classe de entidade User gerada automaticamente, você deve adicionar a palavra-chave override aos 4 campos a seguir ou comentar esses campos, uma vez que são herdados de IdentityUser (Etapa 1). Observe que toda vez que você atualiza seu EDMX e regenera as classes DBContext e Entity, você terá que definir isso novamente.
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }
fonte
Respostas:
Deve ser possível usar o sistema de identidade com POCO e Database First, mas você terá que fazer alguns ajustes:
partial
. Isso possibilitará que você forneça implementações adicionais em um arquivo separado.User
classe em outro arquivoIsso fará com que a
User
classe implemente a interface certa, sem mexer nos arquivos reais gerados (editar os arquivos gerados é sempre uma má ideia).fonte
Meus passos são muito semelhantes, mas eu queria compartilhar.
1) Crie um novo projeto MVC5
2) Crie um novo Model.edmx. Mesmo que seja um novo banco de dados e não tenha tabelas.
3) Edite web.config e substitua esta cadeia de conexões gerada:
com esta cadeia de conexões:
Em seguida, crie e execute o aplicativo. Cadastre um usuário e as tabelas serão criadas.
fonte
EDIT: Identidade ASP.NET com EF Database First para MVC5 CodePlex Project Template.
Eu queria usar um banco de dados existente e criar relacionamentos com ApplicationUser. Foi assim que fiz usando o SQL Server, mas a mesma ideia provavelmente funcionaria com qualquer banco de dados.
:base("DefaltConnection")
para usar o DbContext do seu projeto.Editar: Diagrama de Classe de Identidade Asp.Net
fonte
IdentityUser
é inútil aqui porque é o objeto de código usado peloUserStore
para autenticação. Depois de definir meu próprioUser
objeto, implementei uma classe parcial que implementa oIUser
que é usado pelaUserManager
classe. Eu queria meuId
s fosse emint
vez de string, então apenas retornei toString () do UserID. Da mesma forma que eu querian
emUsername
ser com inicial minúscula.Você de forma alguma precisa
IUser
. É apenas uma interface usada peloUserManager
. Portanto, se você quiser definir um "IUser" diferente, terá que reescrever essa classe para usar sua própria implementação.Agora você escreve o seu próprio,
UserStore
que lida com todo o armazenamento de usuários, declarações, funções, etc. Implementar as interfaces de tudo que o código-primeiroUserStore
faz e mudewhere TUser : IdentityUser
parawhere TUser : User
onde "Usuário" é seu objeto de entidadeAqui estão alguns exemplos de algumas das implementações de interface
Usando o modelo MVC 5, mudei o
AccountController
para ficar assim.Agora, o login deve funcionar com suas próprias tabelas.
fonte
Dê uma olhada neste projeto no GitHub: https://github.com/KriaSoft/AspNet.Identity
Que inclui:
Veja também : Como criar provedor de banco de dados primeiro para identidade ADO.NET
fonte
Boa pergunta.
Eu sou mais um banco de dados em primeiro lugar. O primeiro paradigma do código parece um tanto solto para mim, e as "migrações" parecem muito sujeitas a erros.
Eu queria personalizar o esquema de identidade aspnet e não me incomodar com migrações. Estou bem versado com projetos de banco de dados do Visual Studio (sqlpackage, data-dude) e como ele faz um bom trabalho na atualização de esquemas.
Minha solução simplista é:
1) Crie um projeto de banco de dados que espelhe o esquema de identidade aspnet 2) use a saída deste projeto (.dacpac) como um recurso de projeto 3) implante o .dacpac quando necessário
Para MVC5, modificar a
ApplicationDbContext
classe parece fazer isso funcionar ...1) Implementar
IDatabaseInitializer
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext> { ... }
2) No construtor, sinalize que esta classe implementará a inicialização do banco de dados:
Database.SetInitializer<ApplicationDbContext>(this);
3) Implementar
InitializeDatabase
:Aqui, escolhi usar o DacFX e implantar meu .dacpac
fonte
Passei várias horas trabalhando nisso e finalmente encontrei uma solução que compartilhei no meu blog aqui . Basicamente, você precisa fazer tudo o que foi dito na resposta de stink , mas com uma coisa adicional: garantir que o Identity Framework tenha uma string de conexão SQL-Client específica no topo da string de conexão do Entity Framework usada para suas entidades de aplicativo.
Em resumo, seu aplicativo usará uma string de conexão para o Identity Framework e outra para as entidades de seu aplicativo. Cada string de conexão é de um tipo diferente. Leia minha postagem do blog para um tutorial completo.
fonte
Temos um projeto Entity Model DLL onde mantemos nossa classe de modelo. Também mantemos um projeto de banco de dados com todos os scripts de banco de dados. Minha abordagem foi a seguinte
1) Crie seu próprio projeto que tenha o EDMX usando o banco de dados primeiro
2) Faça o script das tabelas em seu banco de dados, usei VS2013 conectado ao localDB (Data Connections) e copiei o script para o projeto de banco de dados, adicione quaisquer colunas personalizadas, por exemplo: Data de nascimento [DATE] não nula
3) Implantar o banco de dados
4) Atualizar o projeto Modelo (EDMX) Adicionar ao projeto Modelo
5) Adicione quaisquer colunas personalizadas à classe do aplicativo
No projeto MVC, AccountController adicionou o seguinte:
O provedor de identidade deseja que uma string de conexão SQL funcione, para manter apenas 1 string de conexão para o banco de dados, extraia a string do provedor da string de conexão EF
fonte
Descobri que @ JoshYates1980 tem a resposta mais simples.
Depois de uma série de tentativas e erros, fiz o que Josh sugeriu e substituí o
connectionString
por minha string de conexão DB gerada. o que eu estava confuso originalmente era a seguinte postagem:Como adicionar autenticação de identidade ASP.NET MVC5 ao banco de dados existente
Onde a resposta aceita de @Win indica a mudança do
ApplicationDbContext()
nome da conexão. Isso é um pouco vago se você estiver usando a abordagem de Entidade e Banco de Dados / Modelo em que a string de conexão do banco de dados é gerada e adicionada aoWeb.config
arquivo.O
ApplicationDbContext()
nome da conexão é mapeado para a conexão padrão noWeb.config
arquivo. Portanto, o método de Josh funciona melhor, mas para torná-loApplicationDbContext()
mais legível, sugiro alterar o nome do seu banco de dados como @Win postado originalmente, certificando-se de alterar oconnectionString
para "DefaultConnection" noWeb.config
e comentar e / ou remover a Entidade banco de dados gerado inclui.Exemplos de código:
fonte