EditまたはCreateアクションの結果メソッドでEF4がDbEntityValidationExceptionをスローし、内部メッセージが次のようになるという混乱する問題に直面しています。
フィールドBodyは、最大長が「128」の文字列または配列型である必要があります。
問題のモデルは次のようになります。
[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; }
}
実際のデータベースの「Body」フィールドはテキスト型であるため、明確な制限はありません。私が投稿しようとしているデータはこれです:
<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>
Editメソッドの例は次のようになります。
[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");
}
そして最後に、実際にうんざりする作業を行うメソッドは次のとおりです。
public void Update(T Entity)
{
dbset.Attach(Entity);
db.Entry(Entity).State = System.Data.EntityState.Modified;
db.Commit();
}
問題の原因となっている可能性のあるコードやデータベースに何も表示されないので、他にどこを見ればよいですか?
コードの最初の文字列フィールドのデフォルトの長さは128です。EF検証を使用している場合は、例外がスローされます。以下を使用してサイズを拡張できます。
[StringLength(Int32.MaxValue)]
public string Body { get; set; }
この投稿はどういうわけか人気になったので、私も機能する2番目のアプローチを追加します。
[MaxLength]
public string Body { get; set; }
StringLengthAttribute
はSystem.ComponentModel.DataAnnotations Assemblyから、MaxLengthAttribute
はEntityFramework Assembly(EF 4.1)からです。
Model Firstアプローチを使用してこのエラーが発生した場合は、EFモデルを確認してください。単に、更新しているエンティティのプロパティにMax Length
属性セット。
使用した可能性があります
Property(m => m.Body ).IsRequired().HasMaxLength(128);
OnModelCreatingのdbcontextクラス。だからあなたの長さに従って変更してください
私のために、 [MaxLength]
が機能しませんでした。以下のステートメントをコンテキストに追加しました。
modelBuilder.Entity<YourModel>().Property(e => e.YourColumn).HasMaxLength(4000);
私は "40"の制限を超えては試していませんが、さらに拡張できると思います。コンパイラでエラーが表示されるため、これを保持する必要はありません128。