更新自定义成员资格用户

时间:2016-01-27 19:07:58

标签: c# asp.net-mvc entity-framework asp.net-membership

我似乎无法在任何地方找到答案。我使用自定义会员提供商和会员用户使用我自己的桌子,这看起来比它的价值太麻烦了。更新用户记录时,我似乎也需要更新它的会员用户实例,否则我依赖会员用户的数据,它不会对应更新的数据库。

我已经创建了自己的更新成员资格用户方法,因为现有的方法只接受了它自己的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

的重复

1 个答案:

答案 0 :(得分:0)

我最终发现MembershipUser没有更新,因为每次调用GetUser()时,所涉及的查询都使用了FirstOrDefault()。结果是缓存结果而不是检索新结果。通过向查询本身添加AsNoTracking(),我现在可以获得更新的结果,而无需调用UpdateUser()。