I have a test that requires all users in my SimpleMembershipProvider UserProfile table to be deleted. I'd like to do this in my SeedMembership() method (below). Something like membership.DeleteAllUsers. Any idea how this can be done?
private int SeedMembership()
{
if (!WebMatrix.WebData.WebSecurity.Initialized)
{
WebSecurity.InitializeDatabaseConnection("TestConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
}
var roles = (SimpleRoleProvider)Roles.Provider;
var membership = (SimpleMembershipProvider)Membership.Provider;
if (!roles.RoleExists("Admin"))
{
roles.CreateRole("Admin");
}
if (!roles.RoleExists("User"))
{
roles.CreateRole("User");
}
// Somehow delete all users here
if (membership.GetUser("user", false) == null)
{
membership.CreateUserAndAccount("user", "covert");
}
if (!roles.GetRolesForUser("user").Contains("Admin"))
{
roles.AddUsersToRoles(new[] { "user" }, new[] { "admin" });
}
return membership.GetUserId("user");
}
I have had to implement similar functionality on several projects, the simplest way I have found to do it is this (from memory, but I think this is going to work):
var dbUsernames = context.Database.SqlQuery<string>("SELECT UserName FROM UserProfile");
foreach (string dbUsername in dbUsernames)
{
string[] userRoles = Roles.GetRolesForUser(dbUsername);
if (userRoles != null && userRoles.Length > 0)
{
Roles.RemoveUserFromRoles(dbUsername, userRoles);
}
int userId = context.Database.SqlQuery<int>("SELECT UserId FROM UserProfile WHERE UserName = {0}", dbUsername).First();
// HERE: Delete any other dependent rows in other tables that use UserId, and have referential integrity
// Now tear down any final bits and delete the user, for example:
Membership.DeleteUser(dbUsername, true);
context.Database.ExecuteSqlCommand(
"DELETE FROM webpages_Membership WHERE UserId = {0}", userId);
}