我似乎无法在任何地方找到答案。我使用自定义会员提供商和会员用户使用我自己的桌子,这看起来比它的价值太麻烦了。更新用户记录时,我似乎也需要更新它的会员用户实例,否则我依赖会员用户的数据,它不会对应更新的数据库。
我已经创建了自己的更新成员资格用户方法,因为现有的方法只接受了它自己的MembershipUser类:
public static void UpdateAccountUser(AccountUser accountUser)
{
// Custom MembershipUser
ToMembershipUser user = new ToMembershipUser(
"AccountUserMembershipProvider",
accountUser.FirstName + " " + accountUser.LastName,
accountUser.ID,
accountUser.Email,
"",
"",
true,
false,
DateTime.Now,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue);
// Fill additional properties
user.ID = accountUser.ID;
user.Email = accountUser.Email;
user.FirstName = accountUser.FirstName;
user.LastName = accountUser.LastName;
user.Password = accountUser.Password;
user.MediaID = accountUser.MediaID;
user.Media = accountUser.Media;
user.Identity = accountUser.Identity;
user.CreatedAt = accountUser.CreatedAt;
user.UpdatedAt = accountUser.UpdatedAt;
UpdateCookie(user.Email);
}
private static void UpdateCookie(string email)
{
HttpCookie cookie = FormsAuthentication.GetAuthCookie(email, true);
var ticket = FormsAuthentication.Decrypt(cookie.Value);
// Store UserData inside the Forms Ticket with all the attributes
// in sync with the web.config
var newticket = new FormsAuthenticationTicket(ticket.Version,
ticket.Name,
ticket.IssueDate,
ticket.Expiration,
true, // always persistent
email,
ticket.CookiePath);
// Encrypt the ticket and store it in the cookie
cookie.Value = FormsAuthentication.Encrypt(newticket);
cookie.Expires = newticket.Expiration.AddHours(24);
HttpContext.Current.Response.Cookies.Set(cookie);
}
现在显然这只是创建一个新实例而不是更新现有实例,这不允许我在不注销并重新登录的情况下查看更新的详细信息。任何想法?
编辑 所以我设法找到了其他人使用自己的自定义更新方法的示例,但他们似乎正在做的是更新数据库而不是MembershipUser本身。我已经这样做了吗?!
我试图改为更新FormsAuthenticationCookie,然后在调用Membership.GetUser()时,我至少传递了一个更新的User.Identity.Name,但无效,即使数据库已更新仍然是旧数据。我已经没想完了......
这可能是昨天问题MembershipUser not getting updated result from database
的重复答案 0 :(得分:0)
我最终发现MembershipUser没有更新,因为每次调用GetUser()时,所涉及的查询都使用了FirstOrDefault()。结果是缓存结果而不是检索新结果。通过向查询本身添加AsNoTracking(),我现在可以获得更新的结果,而无需调用UpdateUser()。