Premiers problèmes liés au code Entity Framework (table SimpleMembership UserProfile)

Si vous avez utilisé ASP.NET MVC 4, vous remarquerez que le paramètre par défaut d’une application Internet consiste à utiliser le fournisseur SimpleMembership. Tout cela est parfait et fonctionne correctement.

Le problème vient avec la génération de firebase database par défaut, ils ont un UserProfile pour UserProfile défini comme suit:

 [Table("UserProfile")] public class UserProfile { [Key] [DatabaseGeneratedAtsortingbute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } public ssortingng UserName { get; set; } } 

.. qui est ensuite généré comme ceci:

 using (var context = new UsersContext()) { if (!context.Database.Exists()) { // Create the SimpleMembership database without Entity Framework migration schema ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); } } 

Cela fonctionne bien, la firebase database est générée parfaitement et fonctionne sans problème. Cependant, si je dois changer le POCO comme ceci et supprimer la firebase database:

 [Table("UserProfile")] public class UserProfile { [Key] [DatabaseGeneratedAtsortingbute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } public ssortingng EmailAddress { get; set; } public ssortingng FirstName { get; set; } public ssortingng Surname { get; set; } public ssortingng Country { get; set; } public ssortingng CompanyName { get; set; } } 

Seules les 2 premières colonnes sont générées, UserId et EmailAddress . Cela fonctionne très bien du sharepoint vue du code (connexion / enregistrement parlé), mais évidemment, aucune de mes autres données utilisateur n’est stockée.

Est-ce que j’ai râté quelque chose? La firebase database devrait sûrement être basée sur l’ensemble de l’object UserProfile .

1 – Vous devez activer les migrations, de préférence avec EntityFramework 5. Utilisez Enable-Migrations dans le gestionnaire de packages NuGet.

2 – Déplacez votre

 WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 

à votre méthode Seed dans votre classe YourMvcApp / Migrations / Configuration.cs

  protected override void Seed(UsersContext context) { WebSecurity.InitializeDatabaseConnection( "DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); if (!Roles.RoleExists("Administrator")) Roles.CreateRole("Administrator"); if (!WebSecurity.UserExists("lelong37")) WebSecurity.CreateUserAndAccount( "lelong37", "password", new {Mobile = "+19725000000", IsSmsVerified = false}); if (!Roles.GetRolesForUser("lelong37").Contains("Administrator")) Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"}); } 

Désormais, EF5 sera chargé de créer votre table UserProfile. Après cela, vous appellerez WebSecurity.InitializeDatabaseConnection pour n’enregistrer que SimpleMembershipProvider avec la table UserProfile déjà créée, en indiquant également à SimpleMembershipProvider quelle colonne est UserId et UserName. Je montre également un exemple de la manière dont vous pouvez append des utilisateurs, des rôles et associer les deux dans votre méthode Seed à des propriétés / champs personnalisés UserProfile, par exemple le mobile (numéro) d’un utilisateur.

3 – Désormais, lorsque vous exécuterez update-database à partir de la console Package Manager, EF5 configurera votre table avec toutes vos propriétés personnalisées.

Pour des références supplémentaires, veuillez vous référer à cet article avec le code source: http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom -user-properties /

Il semble que je puisse enfin avoir compris cela et que ce n’est peut-être qu’un malentendu géant.

En fin de compte, je m’attendais à ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); faire ce qu’il ne fait tout simplement pas, c’est-à-dire créer toutes les tables de la firebase database qui n’existent pas, ou simplement les mettre à jour si elles le font et si elles sont différentes.

En réalité, il exécute littéralement une instruction CREATE DATABASE , qui est pour moi la chose la plus inutile du monde. À moins que vous ne travailliez dans un environnement vraiment étrange, vous aurez toujours une firebase database active et donc, elle existera toujours (et par la suite, la création de la table ne se produira jamais!), Je préférerais ne pas donner l’access à des utilisateurs du monde réel. de toute façon créer une firebase database.

Quoi qu’il en soit, j’ai résolu mon problème spécifique: vouloir que UserProfile (et les tables associées) crée la firebase database à l’aide de l’initialiseur DropCreateDatabaseIfModelChanges et impose une initialisation comme celle DropCreateDatabaseIfModelChanges ci-dessous:

 public SimpleMembershipInitializer() { #if DEBUG Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); #else Database.SetInitializer(null); #endif try { using (var context = new DataContext()) { if (!context.Database.Exists()) { ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); } context.Database.Initialize(true); } WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); } catch (Exception ex) { throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); } } 

.. ceci fonctionne et est parfait pour le développement mais est plutôt inutile dans la pratique car il va littéralement laisser tomber la firebase database et la recréer à partir de zéro si le modèle change. Pour moi, cela rend pratiquement inutile la pratique du code d’abord sous sa forme par défaut et je reviendrai probablement à une génération from-DB edmx.

Le “mystère” derrière la table UserProfile toujours en cours de création est que WebSecurity.InitializeDatabaseConnection initialisera la table si elle n’existe pas en fonction des champs que vous y avez entrés. C’est pourquoi EmailAddress été créé à la place de UserName , car j’ai changé. c’est dans ça.

J’avais le même problème. J’ai ajouté du code pour que les migrations aient lieu juste avant la “CreateDatabase” dans SimpleMembershipInitializer.

Cela a résolu le problème pour moi, sauf que je pense que mes migrations vont maintenant être appliquées dans Azure, quel que soit le paramètre défini dans le profil de publication.

  private class SimpleMembershipInitializer { public SimpleMembershipInitializer() { Database.SetInitializer(null); // forcing the application of the migrations so the users table is modified before // the code below sortinges to create it. var migrations = new MigrateDatabaseToLatestVersion(); var context = new WomContext(); migrations.InitializeDatabase(context); try {.... 

Si vous n’avez pas l’intention d’apporter des modifications une fois le système en service et que cela ne se produit que dans le développement, vous ne souhaitez pas activer les migrations. Essayez de tronquer la table __MigrationHistory.

 truncate table __MigrationHistory