Est-il possible d'utiliser la nouvelle identité Asp.net avec Database First et EDMX? Ou seulement avec le code d'abord?
Voici ce que j'ai fait:
1) J'ai créé un nouveau projet MVC5 et j'ai demandé à la nouvelle identité de créer les nouvelles tables User et Roles dans ma base de données.
2) J'ai ensuite ouvert mon fichier Database First EDMX et l'ai glissé dans la nouvelle table Identity Users puisque j'ai d'autres tables qui s'y rapportent.
3) Lors de la sauvegarde de l'EDMX, le générateur Database First POCO créera automatiquement une classe User. Cependant, UserManager et RoleManager s'attendent à ce qu'une classe User hérite du nouvel espace de noms Identity (Microsoft.AspNet.Identity.IUser), donc l'utilisation de la classe POCO User ne fonctionnera pas.
Je suppose qu'une solution possible est de modifier mes classes de génération POCO pour que ma classe utilisateur hérite d'IUser?
Ou est ASP.NET Identity uniquement compatible avec Code First Design?
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
Mise à jour: Suite à la suggestion d'Anders Abel ci-dessous, c'est ce que j'ai fait. Cela fonctionne, mais je me demande s'il existe une solution plus élégante.
1) J'ai étendu ma classe User d'entité en créant une classe partielle dans le même espace de noms que mes entités générées automatiquement.
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
2) J'ai changé mon DataContext pour hériter d'IdentityDBContext au lieu de DBContext. Notez que chaque fois que vous mettez à jour votre EDMX et régénérez les classes DBContext et Entity, vous devrez le redéfinir.
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
3) Dans votre classe d'entité User générée automatiquement, vous devez ajouter le mot-clé override aux 4 champs suivants ou commenter ces champs car ils sont hérités d'IdentityUser (étape 1). Notez que chaque fois que vous mettez à jour votre EDMX et régénérez les classes DBContext et Entity, vous devrez le redéfinir.
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }
Réponses:
Il devrait être possible d'utiliser le système d'identité avec POCO et Database First, mais vous devrez faire quelques ajustements:
partial
. Cela vous permettra de fournir une implémentation supplémentaire dans un fichier séparé.User
classe dans un autre fichierCela permettra à la
User
classe d'implémenter la bonne interface, sans toucher aux fichiers générés (éditer les fichiers générés est toujours une mauvaise idée).la source
Mes démarches sont très similaires mais je voulais partager.
1) Créer un nouveau projet MVC5
2) Créez un nouveau Model.edmx. Même s'il s'agit d'une nouvelle base de données et n'a pas de tables.
3) Modifiez web.config et remplacez cette chaîne de connexion générée:
avec cette chaîne de connexion:
Ensuite, créez et exécutez l'application. Enregistrez un utilisateur et les tables seront créées.
la source
EDIT: Identité ASP.NET avec base de données EF d'abord pour le modèle de projet MVC5 CodePlex.
Je voulais utiliser une base de données existante et créer des relations avec ApplicationUser. C'est ainsi que je l'ai fait en utilisant SQL Server, mais la même idée fonctionnerait probablement avec n'importe quelle base de données.
:base("DefaltConnection")
pour utiliser le DbContext de votre projet.Edit: Diagramme de classes d'identité Asp.Net
la source
IdentityUser
ne vaut rien ici car c'est l'objet code-first utilisé par leUserStore
pour l'authentification. Après avoir défini mon propreUser
objet, j'ai implémenté une classe partielle qui implémenteIUser
qui est utilisée par laUserManager
classe. Je voulais que monId
s soitint
au lieu de string, donc je renvoie simplement le toString () de l'ID utilisateur. De même , je voulaisn
enUsername
être sans majuscule.Vous n'en avez pas besoin
IUser
. Ce n'est qu'une interface utilisée par leUserManager
. Donc, si vous voulez définir un "IUser" différent, vous devrez réécrire cette classe pour utiliser votre propre implémentation.Vous écrivez maintenant votre propre
UserStore
qui gère tous le stockage des utilisateurs, des réclamations, des rôles, etc. Mettre en œuvre les interfaces de tout ce que le code premierUserStore
fait et le changementwhere TUser : IdentityUser
d'where TUser : User
où « l' utilisateur » est votre objet entitéVoici quelques exemples sur certaines des implémentations d'interface
En utilisant le modèle MVC 5, j'ai changé le
AccountController
pour ressembler à ceci.La connexion à présent devrait fonctionner avec vos propres tables.
la source
Jetez un œil à ce projet sur GitHub: https://github.com/KriaSoft/AspNet.Identity
Qui inclut:
Voir également : Comment créer un fournisseur Database-First pour ADO.NET Identity
la source
Bonne question.
Je suis plutôt une personne à la base de données. Le paradigme du code premier me semble lâche, et les «migrations» semblent trop sujettes aux erreurs.
Je voulais personnaliser le schéma d'identité aspnet et ne pas me soucier des migrations. Je connais bien les projets de base de données Visual Studio (sqlpackage, data-mec) et comment il fait un très bon travail de mise à niveau des schémas.
Ma solution simpliste est de:
1) Créer un projet de base de données qui reflète le schéma d'identité aspnet 2) utiliser la sortie de ce projet (.dacpac) comme ressource de projet 3) déployer le .dacpac si nécessaire
Pour MVC5, la modification de la
ApplicationDbContext
classe semble faire avancer les choses ...1) Mettre en œuvre
IDatabaseInitializer
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext> { ... }
2) Dans le constructeur, signalez que cette classe implémentera l'initialisation de la base de données:
Database.SetInitializer<ApplicationDbContext>(this);
3) Mettre en œuvre
InitializeDatabase
:Ici, j'ai choisi d'utiliser DacFX et de déployer mon .dacpac
la source
J'ai passé plusieurs heures à y travailler et j'ai finalement trouvé une solution que j'ai partagée sur mon blog ici . Fondamentalement, vous devez faire tout ce qui est dit dans la réponse de stink , mais avec une chose supplémentaire: vous assurer qu'Identity Framework a une chaîne de connexion SQL-Client spécifique au-dessus de la chaîne de connexion Entity Framework utilisée pour vos entités d'application.
En résumé, votre application utilisera une chaîne de connexion pour Identity Framework et une autre pour vos entités d'application. Chaque chaîne de connexion est d'un type différent. Lisez mon article de blog pour un tutoriel complet.
la source
Nous avons un projet DLL de modèle d'entité dans lequel nous conservons notre classe de modèle. Nous conservons également un projet de base de données avec tous les scripts de base de données. Mon approche était la suivante
1) Créez votre propre projet qui a l'EDMX en utilisant d'abord la base de données
2) Script les tables de votre base de données, j'ai utilisé VS2013 connecté à localDB (Data Connections) et copié le script dans le projet de base de données, ajoutez des colonnes personnalisées, par exemple BirthDate [DATE] non nul
3) Déployez la base de données
4) Mettre à jour le projet de modèle (EDMX) Ajouter au projet de modèle
5) Ajoutez des colonnes personnalisées à la classe d'application
Dans le projet MVC AccountController a ajouté ce qui suit:
Le fournisseur d'identité veut une chaîne de connexion SQL pour que cela fonctionne, pour ne conserver qu'une seule chaîne de connexion pour la base de données, extraire la chaîne de fournisseur de la chaîne de connexion EF
la source
J'ai trouvé que @ JoshYates1980 avait la réponse la plus simple.
Après une série d'essais et d'erreurs, j'ai fait ce que Josh a suggéré et
connectionString
j'ai remplacé le par ma chaîne de connexion DB générée. ce que j'étais confus à l'origine était le message suivant:Comment ajouter l'authentification d'identité ASP.NET MVC5 à la base de données existante
Où la réponse acceptée de @Win indiquait de changer le
ApplicationDbContext()
nom de la connexion. Ceci est un peu vague si vous utilisez Entity et une première approche de base de données / modèle où la chaîne de connexion à la base de données est générée et ajoutée auWeb.config
fichier.Le
ApplicationDbContext()
nom de la connexion est mappé à la connexion par défaut dans leWeb.config
fichier. Par conséquent, la méthode de Josh fonctionne mieux, mais pour rendre leApplicationDbContext()
plus lisible, je suggérerais de changer le nom de votre base de données comme @Win initialement publié, en veillant à changer leconnectionString
pour le "DefaultConnection" dans leWeb.config
et commenter et / ou supprimer l'entité la base de données générée comprend.Exemples de code:
la source