Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework Code-First Issues (SimpleMembership UserProfile table)

If you've used ASP.NET MVC 4 you'll notice that the default for an Internet Application is to use the SimpleMembership provider, this is all well and good and works fine.

The issue comes with the default database generation, they have a POCO for UserProfile defined like so:

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

.. which is then generated like this:

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

This works fine, the database is generated just fine and works without issue. However, if I am to change the POCO like this and delete the database:

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

Only the first 2 columns are generated, UserId and EmailAddress. It works just fine code-wise (talking login/registration), but obviously none of my other user data is stored.

Am I missing something here? Surely it should generate the database based off the whole UserProfile object.

like image 375
Rudi Visser Avatar asked Sep 19 '12 20:09

Rudi Visser


People also ask

How do I use code first in Entity Framework?

Step 1 − First, create the console application from File → New → Project… Step 2 − Select Windows from the left pane and Console Application from the template pane. Step 3 − Enter EFCodeFirstDemo as the name and select OK. Step 4 − Right-click on your project in the solution explorer and select Manage NuGet Packages…


1 Answers

1 - You need to enable migrations, prefereably with EntityFramework 5. Use Enable-Migrations in the NuGet package manager.

2 - Move your

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

to your Seed method in your YourMvcApp/Migrations/Configuration.cs class

    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"});     } 

Now EF5 will be in charge of creating your UserProfile table, after doing so you will call the WebSecurity.InitializeDatabaseConnection to only register SimpleMembershipProvider with the already created UserProfile table, also tellling SimpleMembershipProvider which column is the UserId and UserName. I am also showing an example of how you can add Users, Roles and associating the two in your Seed method with custom UserProfile properties/fields e.g. a user's Mobile (number).

3 - Now when you run update-database from Package Manager Console, EF5 will provision your table with all your custom properties

For additional references please refer to this article with sourcecode: http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

like image 144
LeLong37 Avatar answered Sep 22 '22 14:09

LeLong37