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?
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).
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
.
Peut-être que vous avez utilisé
Property(m => m.Body ).IsRequired().HasMaxLength(128);
Sur votre classe dbcontext dans OnModelCreating . Donc changez selon votre longueur
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.