Переопределение длины строки UserName не работало при вызове UserManager.CreateUserAsync, даже если база данных имеет правильную длину строки.

Проблема довольно проста, я изменил длину по умолчанию (32) для свойства имени пользователя на 500, но кажется, что код застрял на 32. Есть идеи, почему это происходит?

Длина строки UserName для AbpUsers:

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

И это успешно обновило длину имени пользователя db.

Но когда я позвонил

CheckErrors(await UserManager.CreateAsync(user));

Он вернет:

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;
        }
   }

Ваша помощь будет высоко оценена!


person Spencer    schedule 11.08.2017    source источник


Ответы (2)


В AbpUserBase есть константа с именем 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;

        //...
}

Причина этой модификации заключается в том, что UserName проверяется классом UserDto, как вы видите ниже;

[Required]
[StringLength(AbpUserBase.MaxUserNameLength)]
public string UserName { get; set; }
person Alper Ebicoglu    schedule 14.08.2017
comment
Извините, я попытался переопределить AbpUserBase и сослаться на новый MaxUserNameLength в коде, но безуспешно. - person Spencer; 16.08.2017
comment
вам нужно сделать это в DbContext перед строкой base.OnModelCreating(modelBuilder) - person Alper Ebicoglu; 16.08.2017
comment
Спасибо за ответ, но не могли бы вы объяснить, как изменить MaxUserNameLength в OnModelCreating? Мне жаль, что я не совсем понимаю, почему это важно. Я создал новую базу данных с аннотацией UserName, явно установленной на [StringLength(1000)]. EF может успешно генерировать таблицы с nvarchar 1000, но почему-то вставка просто не работает. - person Spencer; 17.08.2017
comment
потому что класс UserDto имеет атрибут MaxLength, ссылающийся на AbpUserBase.MaxUserNameLength - person Alper Ebicoglu; 17.08.2017
comment
Я удалил атрибут UserDto и установил для него значение [StringLength(1000)] - person Spencer; 17.08.2017

После нескольких часов сравнения с шаблоном abp я выяснил, почему это происходит, потому что я использовал [MaxLength] вместо [StringLength] для User Entity.

person Spencer    schedule 23.08.2017