web-dev-qa-db-ja.com

Entity Framework Validation confusion-最大文字列長「128」

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

問題の原因となっている可能性のあるコードやデータベースに何も表示されないので、他にどこを見ればよいですか?

31
Phil.Wheeler

コードの最初の文字列フィールドのデフォルトの長さは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)からです。

68
Ladislav Mrnka

Model Firstアプローチを使用してこのエラーが発生した場合は、EFモデルを確認してください。単に、更新しているエンティティのプロパティにMax Length属性セット。

2
Marty

使用した可能性があります

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

OnModelCreatingのdbcontextクラス。だからあなたの長さに従って変更してください

1
Sajidur Rahman

私のために、 [MaxLength]が機能しませんでした。以下のステートメントをコンテキストに追加しました。

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

私は "40"の制限を超えては試していませんが、さらに拡張できると思います。コンパイラでエラーが表示されるため、これを保持する必要はありません128

0
Zerotoinfinity