Asp.net mvc MVC电子邮件确认(序列包含多个元素)

Asp.net mvc MVC电子邮件确认(序列包含多个元素),asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我目前正在尝试向我的网站添加电子邮件确认,我遇到了一些问题 我可以成功注册一个帐户,注册后,将confirmationToken放入我的数据库,并发送一封带有查询字符串链接的电子邮件:当转到此链接时,将调用控制器操作RegistrationConfirmation,方法ConfirmAccount执行查询,以查看是否可以找到具有url中传递的确认令牌的用户 调试时,我在这一行得到错误“序列包含多个元素”:Account user=context.Accounts.SingleOrDefault(

我目前正在尝试向我的网站添加电子邮件确认,我遇到了一些问题

我可以成功注册一个帐户,注册后,将confirmationToken放入我的数据库,并发送一封带有查询字符串链接的电子邮件:当转到此链接时,将调用控制器操作RegistrationConfirmation,方法ConfirmAccount执行查询,以查看是否可以找到具有url中传递的确认令牌的用户

调试时,我在这一行得到错误“序列包含多个元素”:
Account user=context.Accounts.SingleOrDefault(u=>u.ConfirmationToken==ConfirmationToken)

我不确定出了什么问题,因为令牌是唯一的,并且数据库中没有重复的令牌

注册HttpPost:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterModel model)
    {
        string confirmationToken = CreateToken();
        Account account = new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email, false, confirmationToken);
        if (DatabaseHandler.isUsernameDuplicate(account.Username))
        {
            // is duplicate // provide notification
        }
        else
        {
            Session["accountID"] = Repository.InsertAccount(new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email,false, confirmationToken));

            // Email Logic
            try
            {
                await client.SendMailAsync(message);
            }
            catch (Exception e)
            {
                ModelState.AddModelError("", "Problem sending email: " + e.Message);
            }
            return View("ConfirmEmail");
        }
        return View();
    }
确认帐户方法:

private bool ConfirmAccount(string confirmationToken)
    {
        RecipeDbContext context = new RecipeDbContext();
        Account user = context.Accounts.SingleOrDefault(u => u.ConfirmationToken == confirmationToken);
        if (user != null)
        {
            user.IsConfirmed = true;
            DbSet<Account> dbSet = context.Set<Account>();
            dbSet.Attach(user);
            context.Entry(user).State = EntityState.Modified;
            context.SaveChanges();

            return true;
        }
        return false;
    }
private bool confirmationAccount(字符串确认令牌)
{
RecipeDbContext context=新RecipeDbContext();
Account user=context.Accounts.SingleOrDefault(u=>u.ConfirmationToken==ConfirmationToken);
如果(用户!=null)
{
user.isconfired=true;
DbSet DbSet=context.Set();
附加(用户);
context.Entry(user.State=EntityState.Modified;
SaveChanges();
返回true;
}
返回false;
}

删除SingleorDefault()并检查结果。。您将知道它不重复,如果要避免此错误,请使用FirstorDefault()。

删除SingleorDefault()并检查结果。。您将知道它不重复,如果要避免此错误,请使用FirstorDefault()。

结果表明查询本身没有问题,RegisterConfirmation HttpGet似乎没有获得confirmToken值,因此我添加了“Id=Request.QueryString.ToString();”现在一切正常:)

结果显示查询本身没有问题,RegisterConfirmation HttpGet似乎没有获得confirmToken值,因此我添加了“Id=Request.QueryString.ToString();”,现在一切正常:)

检查了结果,结果没有重复,如果我使用FirstOrDefault而不是SingleOrDefault,它会传递查询并将Isconfirm设置为true,但是对于错误的用户,我不知道您的数据库,但要符合逻辑。。如果它给了一个用户一个匹配的确认令牌,如果该用户是错误的,那么这就是你的错误。。代码中没有错误。问题是关于Sequence包含不止一个元素,而不是关于您的确认令牌流程,并将context.Accounts.where(u=>u.ConfirmationToken==ConfirmationToken.ToList()的结果发布给我;ToList返回0 accountsHow FirstorDefault()是否可能返回结果而ToList()不返回任何内容。。crazyy..检查了结果,结果不重复,如果我使用FirstOrDefault而不是SingleOrDefault,它会传递查询并将Isconfirm设置为true,但对于错误的用户,我不知道您的数据库,但要符合逻辑。。如果它给了一个用户一个匹配的确认令牌,如果该用户是错误的,那么这就是你的错误。。代码中没有错误。问题是关于Sequence包含不止一个元素,而不是关于您的确认令牌流程,并将context.Accounts.where(u=>u.ConfirmationToken==ConfirmationToken.ToList()的结果发布给我;ToList返回0 accountsHow FirstorDefault()是否可能返回结果而ToList()不返回任何内容。。疯狂。。
private bool ConfirmAccount(string confirmationToken)
    {
        RecipeDbContext context = new RecipeDbContext();
        Account user = context.Accounts.SingleOrDefault(u => u.ConfirmationToken == confirmationToken);
        if (user != null)
        {
            user.IsConfirmed = true;
            DbSet<Account> dbSet = context.Set<Account>();
            dbSet.Attach(user);
            context.Entry(user).State = EntityState.Modified;
            context.SaveChanges();

            return true;
        }
        return false;
    }