简单成员资格WebSecurity.CreateUserAndAccount给出重复的UserId错误

时间:2012-12-12 23:04:21

标签: asp.net-mvc simplemembership

使用MVC 4,Simplemembership

我正在构建一个供企业使用的Web应用程序,因此不希望开箱即用的MVC 4模板功能允许用户注册。相反,我想要一个创建用户视图,只允许管理员访问,然后创建用户。我希望我可以改变寄存器控制器的安全性,然后让当前登录的用户使用现有的Register View创建用户......没有骰子。

这是控制器中的代码。我没有从模板中更改它:

// POST: /Account/Register

        [HttpPost]
        //[AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                try
                {
                    WebSecurity.CreateUserAndAccount(
                        model.UserName,
                        model.Password,
                        new { FirstName = model.FirstName, LastName = model.LastName, Email = model.Email },
                        false
                    );
                    WebSecurity.Login(model.UserName, model.Password);
                    return RedirectToAction("Index", "Home");
                }
                catch (MembershipCreateUserException e)
                {
                    ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

当前登录的用户尝试通过此方法创建新用户时,会出现错误(@第86行):

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_UserProfile_webpages_Membership". The conflict occurred in database "OTIS", table "dbo.webpages_Membership", column 'UserId'.
The statement has been terminated.

Line 84:                 try
Line 85:                 {
Line 86:                     WebSecurity.CreateUserAndAccount(
Line 87:                         model.UserName,
Line 88:                         model.Password,

Hwre是UserProfile类

[Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }

        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }

        [Required]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [Display(Name = "Email")]
        public string Email { get; set; }
    }

WebSecurity.CurrentUserID填充了当前登录的用户,我认为这是导致问题的原因。使用simplemembership提供程序实现此目的的正确方法是什么?

编辑:我已经尝试将其移回允许匿名用户注册,因此当我调试它时,WebSecurity.CurrentUserID为-1,但我仍然得到相同的错误。如果类中的UserId字段使用属性[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]进行修饰,那么如何生成重复键?

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,但是我使用提供程序中的CreateUserAndAccount方法而不是WebSecurity来解决它。

var membership = (SimpleMembershipProvider)Membership.Provider;
membership.CreateUserAndAccount(
    model.UserName,
    model.Password,
    new Dictionary<string, object>{
        { "FirstName", model.FirstName}, 
        { "LastName", model.LastName},
        { "Email", model.Email }
    }
);

答案 1 :(得分:1)

最后回到了这个问题。我的问题是我的数据库关系已损坏。设置了UserProfile表到Membership表的外键约束,以便将UserId列记录为BOTH表中的主键。因此,当它试图在UserProfile中添加一行时,它在Membership中不存在新生成的ID,从而导致错误。只需删除关系并正确重新创建,以便UserProfile.UserId是主要修复它。

答案 2 :(得分:0)

这就是我需要做的一切。我不认为UserProfile或Membership表有任何问题。

 WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
                                  new { Email=model.Email});