web-dev-qa-db-fra.com

Confusion liée à la validation de l'entité: longueur maximale de la chaîne de '128'

Je suis confronté à un problème déroutant dans lequel, dans mes méthodes de résultat d'action Edit ou Create, EF4 lève une exception DbEntityValidationException avec le message interne indiquant:

Le champ Body doit être une chaîne ou type de tableau avec une longueur maximale de '128'.

Le modèle en question ressemble à ceci:

[Table("tblArticles")]
public class Article
{
    [Key]
    public int ID { get; set; }
    [Required(ErrorMessage="Title must be included")]
    public string Title { get; set; }
    [AllowHtml]
    public string Body { get; set; }
    [Required(ErrorMessage="Start Date must be specified")]
    [Display(Name="Start Date")]
    [DisplayFormat(DataFormatString="dd-mm-yyyy")]
    public DateTime? StartDate { get; set; }
    [Required(ErrorMessage = "End Date must be specified")]
    [Display(Name = "End Date")]
    public DateTime? EndDate { get; set; }
    public int Priority { get; set; }
    public bool Archived { get; set; }

    public virtual ICollection<ArticleImage> Images { get; set; }
}

Le champ "Corps" dans la base de données actuelle est de type Texte, il n'y a donc pas de limite évidente. Les données que j'essaye de publier sont les suivantes:

<p>
This is an example to confirm that new articles are looking right.</p>
<p>
<img alt="" src="http://www.google.co.nz/logos/2011/houdini11-sr.jpg"
style="width: 160px; height: 56px; float: left;" /></p>

Un exemple de la méthode Edit ressemble à ceci:

[HttpPost]
public ActionResult Edit(Article article)
{
    if (ModelState.IsValid)
    {
        try
        {
            articleRepository.Update(article);
        }
        catch (DbEntityValidationException dbevEx)
        {
            ErrorSignal.FromCurrentContext().Raise(dbevEx);
            ModelState.AddModelError("FORM", dbevEx);
            return View("Edit", article);
        }
        // Other exception handling happens...
    }

    return RedirectToAction("Index");
}

Et enfin, la méthode qui fait le travail de grognement est la suivante:

public void Update(T Entity)
{
    dbset.Attach(Entity);
    db.Entry(Entity).State = System.Data.EntityState.Modified;
    db.Commit();
}

Je ne vois rien dans le code ou la base de données qui pourrait être à l'origine du problème, alors où devrais-je regarder?

31
Phil.Wheeler

La longueur par défaut du champ de chaîne dans le premier code est 128. Si vous utilisez la validation EF, une exception sera levée. Vous pouvez augmenter la taille en utilisant:

[StringLength(Int32.MaxValue)]
public string Body { get; set; }

Ce post est devenu en quelque sorte populaire, donc j'ajoute une deuxième approche qui fonctionne également:

[MaxLength]
public string Body { get; set; }

StringLengthAttribute provient de System.ComponentModel.DataAnnotations Assembly et MaxLengthAttribute provient de EntityFramework Assembly (EF 4.1).

66
Ladislav Mrnka

Si vous obtenez cette erreur en utilisant une approche Model First, vérifiez le modèle EF: il se peut simplement qu'une propriété de l'entité que vous mettez à jour possède l'attribut Max Length.

2
Marty

Peut-être que vous avez utilisé

Property(m => m.Body ).IsRequired().HasMaxLength(128);

Sur votre classe dbcontext dans OnModelCreating . Donc changez selon votre longueur

1
Sajidur Rahman

Pour moi, [MaxLength] n'a pas fonctionné. J'ai ajouté la déclaration ci-dessous au contexte.

modelBuilder.Entity<YourModel>().Property(e => e.YourColumn).HasMaxLength(4000);

Je n'ai pas essayé de dépasser la limite " 4000 " mais je pense que cela peut être étendu davantage. Vous n'êtes pas obligé de le garder 128 comme le montre l'erreur du compilateur.

0
Zerotoinfinity