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 ModelsAppModel.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>
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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:
1. Set new database connection in web.config
<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 MigrationsConfiguration.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.
Method 2
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.
Method 3
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.
Method 4
RobM has the comprehensive answer and Rob B has the simple answer.
In your scenario, you are setting your base to “MyConnectionString” which in your config file does not exist.
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
Whatever name you give your connectionString has to match whatever you have in your DbContext : base
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MySailorContext") { }
}
Method 5
If all you need is to change the connection string used by the identity provider, the following is not very elegant but seems to work. Search where the IdentityManager class is instantiated and add the following:
//Leave this untouched:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore());
//...and add this:
((IdentityStore)identityManager.Store).DbContext.Configuration
.Database.Connection.ConnectionString = "your connection string here";
Method 6
Since there are alot of changes on this when going to RTM, i have updated the SPA template that uses a WebApi controller for all the identity signin and such. Its a really cool template , if you havent seen it.
I put all my code here:
https://github.com/s093294/aspnet-identity-rtm/tree/master
(Do note, its only for inspiration. I only made it work and nothing more. Properly have a bug or two also).
Method 7
Look for the class that inherits from IdentityDbConect eg:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Then change the “DefaultConnection” to the name of a connection string identified in your web.config.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0