2017-08-11 2 views
1

Le problème est assez simple, j'ai modifié la longueur par défaut (32) pour la propriété username à 500, mais il semble que le code est bloqué à 32. Une idée pourquoi cela se produit?La longueur de la chaîne UserName de substitution ne fonctionnait pas lors de l'appel de UserManager.CreateUserAsync, même si la longueur de la chaîne était correcte.

La longueur de la chaîne pour UserName AbpUsers:

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

Et cela a mis à jour avec succès la longueur db UserName.

Mais quand j'ai appelé

CheckErrors(await UserManager.CreateAsync(user)); 

Il retournerait:

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

Ce qui me gêne est que ce genre d'exception ne peut être capturé par 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; 
     } 
    } 

Votre l'aide serait très appréciée!

Répondre

0

Après des heures de comparaison avec le modèle de abp, je trouve la raison pour laquelle cela est parce que je [MaxLength] au lieu de [StringLength] pour l'entité de l'utilisateur.

0

Il y a une constante appelée MaxUserNameLength dans AbpUserBase. Donc, fondamentalement, vous devez changer cette valeur constante.

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

     //... 
} 

La raison de cette modification est que UserName est en cours de validation UserDto class comme vous le voyez ci-dessous;

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

Désolé, j'ai essayé de remplacer l'AbpUserBase et de faire référence au nouveau MaxUserNameLength dans le code, mais toujours sans succès. – Spencer

+0

vous devez le faire dans DbContext avant base.OnModelCreating (modelBuilder) ligne –

+0

Merci pour la réponse, mais pouvez-vous s'il vous plaît aider à expliquer comment modifier le MaxUserNameLength dans OnModelCreating? Je suis désolé que je ne comprends pas vraiment pourquoi cela compte . J'ai créé une nouvelle base de données, avec l'annotation UserName explicitement définie sur [StringLength (1000)]. EF peut générer avec succès les tables avec nvarchar 1000, mais d'une manière ou d'une autre, l'insertion ne fonctionnera pas. – Spencer