我正在开发一个项目,其中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);
}
}
如果有人有任何想法或有同样的问题,请告诉我!