MVC5 ConfirmEmailAsync失败并抛出DbEntityValidationException

时间:2017-02-08 15:22:15

标签: asp.net-mvc entity-framework asp.net-identity

我正在开发一个项目,其中ApplicationUser因某些设计标准而被修改。如您所见,酒店需要学生。所以每个ApplicationUser都必须有一个学生。这个设计背后的想法是从Student分离IdentityFramework的登录详细信息。

public class ApplicationUser : IdentityUser, IEntity
{
    public DateTime? DateCreated { get; set; }
    public DateTime? DateDeleted  { get; set; }
    public DateTime? DateModified { get; set; }

    [Required]
    public virtual Student Student { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }

当新用户在页面上注册时。电子邮件将发送到他的收件箱。收到电子邮件并尝试激活令牌后。抛出DbEntityValidationException,它表示Student是必填字段。

当调试代码并且光标到达catch时,如果我回顾UserManager,我发现Student存在并且ApplicationUser中的布尔EmailConfirmed为true,但不在数据库中。

在幕后的某个地方,它无法通过SaveChanges。

public async Task<ActionResult> ConfirmEmail(string userId, string code)
    {
        if (userId == null || code == null)
        {
            return View("Error");
        }
        try
        {
            var result = await UserManager.ConfirmEmailAsync(userId, code);
            return View(result.Succeeded ? "ConfirmEmail" : "Error");
        }
        catch (DbEntityValidationException ex)
        {
            var errorMessages = ex.EntityValidationErrors
                    .SelectMany(x => x.ValidationErrors)
                    .Select(x => x.ErrorMessage);
            var fullErrorMessage = string.Join("; ", errorMessages);
            var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
            throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
        }
    }

如果有人有任何想法或有同样的问题,请告诉我!

0 个答案:

没有答案