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

问题描述 投票:31回答:5

我面对的是一个令人困惑的问题,即在我的编辑或创建行动结果的方法,EF4将抛出DbEntityValidationException与内部消息,指出:

领域机构必须是字符串或阵列型具有“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; }
}

在实际的数据库中的“身体”字段类型文本的,所以没有明显的限制存在。我想要发布的数据是这样的:

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

编辑方法的一个例子是这样的:

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

我什么都看不到代码或可能导致问题的数据库,所以还有什么地方我应该看看吗?

entity-framework asp.net-mvc-3 entity-framework-4.1
5个回答
68
投票

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

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

这个帖子成了莫名其妙受欢迎,所以我加入第二种方法也可以工作:

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

StringLengthAttribute是从System.ComponentModel.DataAnnotations组件和MaxLengthAttribute距离的EntityFramework组件(EF 4.1)。


2
投票

如果你使用机型第方法中,该错误,请检查EF型号:它可能仅仅是对您要更新的实体属性具有Max Length属性设置。


1
投票

可能是你使用

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

在OnModelCreating你的DbContext类。因此,改变按您的长度


0
投票

对我来说,[MaxLength]没有工作。我在下面的语句添加到背景。

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

我还没有试过超过“4000”的限制,但我认为它可以进一步扩展。你不必保持128显示由编译器错误。

© www.soinside.com 2019 - 2024. All rights reserved.