Reputation: 646
I created a new project that is using MVC Entity Framework with Individual User Accounts. I want to add FirstName and LastName as properties of a user. The steps in this blog amount to these:
1) Create and run new Project
2) Enable Migrations
3) Add new Properties to ApplicationUser in IdentityModel
4) Add Migration and Update Database
- after this you can verify the new fields are in AspNetUsers table
5) Update RegisterViewModel
6) Update Register View
7) Update Account Controller's Register Post
I did steps 1 - 4, but when I look at AspNetUsers table the fields are not there and I don't understand why.
This is what I did per step 3:
Public Class ApplicationUser
Inherits IdentityUser
Public FirstName As String
Public LastName As String
But after step 4 this is what my table looks like:
Why are FirstName
and LastName
not getting added to the table as expected?
This is what is in my Package Manager Console:
PM> enable-migrations
Checking if the context targets an existing database...
Code First Migrations enabled for project CustomUserProperties.
PM> add-migration "name"
Scaffolding migration 'name'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration name' again.
PM> update-database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201510191912542_name].
Applying explicit migration: 201510191912542_name.
Running Seed method.
PM>
This is the contents of the Migration:
Imports System
Imports System.Data.Entity.Migrations
Imports Microsoft.VisualBasic
Namespace Migrations
Public Partial Class name
Inherits DbMigration
Public Overrides Sub Up()
CreateTable(
"dbo.AspNetRoles",
Function(c) New With
{
.Id = c.String(nullable := False, maxLength := 128),
.Name = c.String(nullable := False, maxLength := 256)
}) _
.PrimaryKey(Function(t) t.Id) _
.Index(Function(t) t.Name, unique := True, name := "RoleNameIndex")
CreateTable(
"dbo.AspNetUserRoles",
Function(c) New With
{
.UserId = c.String(nullable := False, maxLength := 128),
.RoleId = c.String(nullable := False, maxLength := 128)
}) _
.PrimaryKey(Function(t) New With { t.UserId, t.RoleId }) _
.ForeignKey("dbo.AspNetRoles", Function(t) t.RoleId, cascadeDelete := True) _
.ForeignKey("dbo.AspNetUsers", Function(t) t.UserId, cascadeDelete := True) _
.Index(Function(t) t.UserId) _
.Index(Function(t) t.RoleId)
CreateTable(
"dbo.AspNetUsers",
Function(c) New With
{
.Id = c.String(nullable := False, maxLength := 128),
.Email = c.String(maxLength := 256),
.EmailConfirmed = c.Boolean(nullable := False),
.PasswordHash = c.String(),
.SecurityStamp = c.String(),
.PhoneNumber = c.String(),
.PhoneNumberConfirmed = c.Boolean(nullable := False),
.TwoFactorEnabled = c.Boolean(nullable := False),
.LockoutEndDateUtc = c.DateTime(),
.LockoutEnabled = c.Boolean(nullable := False),
.AccessFailedCount = c.Int(nullable := False),
.UserName = c.String(nullable := False, maxLength := 256)
}) _
.PrimaryKey(Function(t) t.Id) _
.Index(Function(t) t.UserName, unique := True, name := "UserNameIndex")
CreateTable(
"dbo.AspNetUserClaims",
Function(c) New With
{
.Id = c.Int(nullable := False, identity := True),
.UserId = c.String(nullable := False, maxLength := 128),
.ClaimType = c.String(),
.ClaimValue = c.String()
}) _
.PrimaryKey(Function(t) t.Id) _
.ForeignKey("dbo.AspNetUsers", Function(t) t.UserId, cascadeDelete := True) _
.Index(Function(t) t.UserId)
CreateTable(
"dbo.AspNetUserLogins",
Function(c) New With
{
.LoginProvider = c.String(nullable := False, maxLength := 128),
.ProviderKey = c.String(nullable := False, maxLength := 128),
.UserId = c.String(nullable := False, maxLength := 128)
}) _
.PrimaryKey(Function(t) New With { t.LoginProvider, t.ProviderKey, t.UserId }) _
.ForeignKey("dbo.AspNetUsers", Function(t) t.UserId, cascadeDelete := True) _
.Index(Function(t) t.UserId)
End Sub
Public Overrides Sub Down()
DropForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers")
DropForeignKey("dbo.AspNetUserLogins", "UserId", "dbo.AspNetUsers")
DropForeignKey("dbo.AspNetUserClaims", "UserId", "dbo.AspNetUsers")
DropForeignKey("dbo.AspNetUserRoles", "RoleId", "dbo.AspNetRoles")
DropIndex("dbo.AspNetUserLogins", New String() { "UserId" })
DropIndex("dbo.AspNetUserClaims", New String() { "UserId" })
DropIndex("dbo.AspNetUsers", "UserNameIndex")
DropIndex("dbo.AspNetUserRoles", New String() { "RoleId" })
DropIndex("dbo.AspNetUserRoles", New String() { "UserId" })
DropIndex("dbo.AspNetRoles", "RoleNameIndex")
DropTable("dbo.AspNetUserLogins")
DropTable("dbo.AspNetUserClaims")
DropTable("dbo.AspNetUsers")
DropTable("dbo.AspNetUserRoles")
DropTable("dbo.AspNetRoles")
End Sub
End Class
End Namespace
FirstName
and LastName
are not in "With" for the AspNetUsers table.
UPDATE:
I restarted again from scratch, and this time what I did was create the Migration, then manually added FirstName and LastName in the AspNetUsers Up function, then ran update-database. That actually worked.
So why it didn't automatically add those fields to the migration, I don't know. But if I do that manually it seems like it works that way.
Thank you!
Upvotes: 0
Views: 1227
Reputation: 646
See the answer I posted in this questions I posted subsequent to this one.
With that I am able to include additional user properties and it all works!
Whether or not that is the "best" way to do it may be another question, but since it's essentially the same as what MVC provides initially I don't see any issues with it.
Upvotes: 1