Я добавляю пользователя (пользовательский класс) через мой репозиторий, перехватывая общий метод Add (T item) и выбрасывая его в закрытый метод AddUser, если item == typeof (User). Он делает именно это, но как только он попадает в вызов FlushMembership (), он выходит слишком рано, т.е. он не затрагивает ничего, кроме вызова FlushMembership (), и, следовательно, пользователь не добавляется. Он проходит через все в FlushMembership, хотя. Я не понимаю.
private void AddUser(User u)
{
var existingUser = Membership.GetUser(u.Username);
// TODO: This could be more elegant
FlushMembership(); // Clean out this crap
var mU = existingUser;
if (mU == null)
{
Membership.CreateUser(u.Username, u.Password, u.Email);
CKDClientAreaEntities.Current.AddObject(GetSetName<User>(), u);
}
else
mU = Membership.GetUser(u.Username);
if(Roles.GetRolesForUser(u.Username).Count() <= 0)
Roles.AddUserToRole(mU.UserName, u.Role);
Membership.UpdateUser(mU);
}
private void FlushMembership()
{
var allMembers = Membership.GetAllUsers();
var allRoles = Roles.GetAllRoles();
foreach(var r in allRoles)
{
var ms = Roles.GetUsersInRole(r);
foreach(var m in ms)
{
var u = Users.Single(o => o.Username == m);
if(u == null)
Roles.RemoveUserFromRoles(m, allRoles); // If the user doesn't exist, remove them from all roles!
}
}
foreach(var m in allMembers)
{
var u = Users.Single(o => o.Username == m);
if (u == null)
Membership.DeleteUser(u.Username);
}
}