I am using the ASP.NET Identity Sample from the Asp-Team, and i am trying to change the database for the IdentityDbContext
...
I tried it with the constructor
public MyDbContext() : base("MyConnectionString") { } // base is IdentityDbContext
like with a DbContext class.
That works well until i try to Register a User...
await IdentityStore.CreateLocalUser(user, model.Password)
returns false
... no error, nothing.
Any ideas how to fix that?
Edit:
Filename is Models\AppModel.cs
, there is the MyDbContext class
originally it was
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}
i changed it to
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
the connection string is working because i have other projects using the same, and they run fine.
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
Here's a step-by-step on how to successfully change your database. First, clean-up anything you might have done previously. If there is any chance you might not get EVERYTHING, it would be best if you just started with a completely fresh copy in a new folder.
Once source is 100% back to original state, ensure everything else is cleaned up, including deleting your "new" database and the original database (aspnet-AspnetIdentitySample-20130627083537_2). You can find the original database using the SQL Server Object Explorer. ("View" -> "SQL Server Object Explorer" in Visual Studio)
Next, before you run your new application for the first time, go ahead and make the change to use your database name of choice. Here are the steps:
<connectionStrings>
<!-- Original Connection String -->
<!--
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;
Initial Catalog=aspnet-AspnetIdentitySample-20130627083537_2;Integrated Security=True"
providerName="System.Data.SqlClient" />
-->
<!-- New Connection String -->
<add name="MyConnectionString" connectionString="Data Source=(LocalDb)\v11.0;
Initial Catalog=MyAspnetIdentitySample_1;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
2. Modify AppModel.cs to have DBContext use new connection:
OLD:
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}
NEW:
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
3. Enable database migrations, create seed data and update to validate
3.1- In the package manager console, enable database migrations:
PM> enable-migrations
3.2 - Update Migrations\Configuration.cs to enable automatic migrations and seed data
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(AspnetIdentitySample.Models.MyDbContext context)
{
context.Users.AddOrUpdate(
p => p.UserName,
new MyUser { UserName = "John Doe" }
);
}
3.3 - Create the database through migration. In the Package Manager Console:
PM> update-database
3.4 - Validate that your new database was created (and that the originally provided db name doesn't exist) by using SQL Server Object Explorer and looking for the database "MyAspnetIdentitySample_1".
4. Run the app and create a new login to verify
This is how you can successfully do it from scratch -- without you providing more detail, I can't troubleshoot it with/for you. You should be able to determine where you went wrong.
The answer is not valid anymore for the 1.0 version that comes with VS2013 on the new mvc5 application. To do this now:
Declare a class like:
public class AppUserStore : UserStore<IdentityUser>
{
public AppUserStore():base(new MY_IDENTITYDBCONTEXT())
{
}
}
And on Startup.Auth.cs change
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
to
UserManagerFactory = () => new UserManager<IdentityUser>(new AppUserStore());
Without this your IdentityDbContext constructor (and OnModelCreating
, for example) will not run when creating a User with asp.net identity.
I had the same problem and struggled a bit since there's not much material in net about ASP.NET Identity yet. After doing a check on the assemblies I found it's actually simple.
Just find the place where your AuthenticationIdentityManager is initialized and use the IdentityStore overload to specify your db context, like this:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new Model()));
My model class inherits DbContext. Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With