实体框架验证混淆 - 最大字符串长度为'128'

Phi*_*ler 31 entity-framework entity-framework-4.1 asp.net-mvc-3

我遇到了一个令人困惑的问题,在我的编辑或创建操作结果方法中,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; }
}
Run Code Online (Sandbox Code Playgroud)

实际数据库中的"Body"字段是Text类型,因此没有明显的限制.我想发布的数据是这样的:

<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>
Run Code Online (Sandbox Code Playgroud)

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");
}
Run Code Online (Sandbox Code Playgroud)

最后,实际执行grunt工作的方法是:

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

我在代码或数据库中看不到可能导致问题的任何内容,所以我还应该在哪里看?

Lad*_*nka 68

代码中字符串字段的默认长度首先是128.如果使用EF验证,它将抛出异常.您可以使用以下方法扩展大小:

[StringLength(Int32.MaxValue)]
public string Body { get; set; }
Run Code Online (Sandbox Code Playgroud)

这篇文章在某种程度上受欢迎,所以我添加了第二种方法,它也有效:

[MaxLength]
public string Body { get; set; }
Run Code Online (Sandbox Code Playgroud)

StringLengthAttribute来自System.ComponentModel.DataAnnotations程序集,MaxLengthAttribute来自EntityFramework程序集(EF 4.1).