调用 UserManager.CreateUserAsync 时覆盖 UserName 字符串长度不起作用,即使 db 具有正确的字符串长度。

The override UserName string length did not work when calling UserManager.CreateUserAsync, even the db has the correct string length.

问题很简单,我将用户名 属性 的默认长度 (32) 修改为 500,但代码似乎固定为 32。知道为什么会这样吗?

AbpUsers 的用户名字符串长度:

public class User : AbpUser<User>
{
    [MaxLength(500)]
    public override string UserName { get; set; }
}

这已成功更新数据库用户名长度。

但是当我打电话给

CheckErrors(await UserManager.CreateAsync(user));

会 return :

System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. 

困扰我的是这种异常无法被SaveChanges捕获:

public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            foreach (var eve in e.EntityValidationErrors)
            {
                Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                    eve.Entry.Entity.GetType().Name, eve.Entry.State);
                foreach (var ve in eve.ValidationErrors)
                {
                    Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                        ve.PropertyName, ve.ErrorMessage);
                }
            }
            throw;
        }
   }

非常感谢您的帮助!

A​​bpUserBase 中有一个名为 MaxUserNameLength 的常量。所以基本上你需要改变那个常数值。

  [Table("AbpUsers")]
  public abstract class AbpUserBase : FullAuditedEntity<long>, IMayHaveTenant, IPassivable
    {
        /// <summary>
        /// Maximum length of the <see cref="UserName"/> property.
        /// </summary>
        public const int MaxUserNameLength = 500;

        //...
}

此修改背后的原因是用户名正在验证为 UserDclass,如下所示;

[Required]
[StringLength(AbpUserBase.MaxUserNameLength)]
public string UserName { get; set; }

经过数小时与 abp 模板的比较,我发现发生这种情况的原因是因为我对用户实体使用了 [MaxLength] 而不是 [StringLength]。