且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

实体框架验证混乱 - 的“128”最大字符串长度

更新时间:2023-11-14 11:35:46

在code字符串字段的默认长度首先是128。如果您使用的是EF验证它会抛出异常。您可以通过使用扩展的大小:

  [StringLength(Int32.MaxValue)
公共字符串车身{搞定;组; }

这后不知何故变得流行,所以我加入第二种方法也可以工作:

  [最大长度]
公共字符串车身{搞定;组; }

StringLengthAttribute 是System.ComponentModel.DataAnnotations装配和 MaxLengthAttribute 是的EntityFramework组件(EF 4.1)。

I'm faced with a confusing problem where in my Edit or Create action result methods, EF4 will throw a DbEntityValidationException with the inner message stating:

The field Body must be a string or array type with a maximum length of '128'.

The model in question looks like this:

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

The "Body" field in the actual database is of type Text, so there's no obvious limit there. The data that I'm trying to post is this:

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

An example of the Edit method looks like this:

[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");
}

And finally, the method that actually does the grunt work is:

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

I can't see anything in code or in the database that might be causing the problem, so where else should I look?

Default length of string field in code first is 128. If you are using EF validation it will throw exception. You can extend the size by using:

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

This post became somehow popular so I'm adding second approach which also works:

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

StringLengthAttribute is from System.ComponentModel.DataAnnotations assembly and MaxLengthAttribute is from EntityFramework assembly (EF 4.1).