Путаница валидации Entity Framework - максимальная длина строки '128' - PullRequest
31 голосов
/ 24 марта 2011

Я столкнулся с запутанной проблемой, когда в моих методах результата действия 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; }
}

Поле «Тело» в фактической базе данных имеет тип 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>

Пример метода редактирования выглядит следующим образом:

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

Я не вижу в коде или в базе данных ничего, что могло бы вызвать проблему, так где еще мне искать?

Ответы [ 5 ]

68 голосов
/ 24 марта 2011

По умолчанию длина строкового поля в первом коде равна 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 голосов
/ 07 сентября 2012

Если вы получаете эту ошибку, используя подход Model First, проверьте модель EF: возможно, просто для свойства обновляемого объекта установлен атрибут Max Length.

1 голос
/ 22 января 2017

Может быть, вы использовали

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

В вашем классе dbcontext в OnModelCreating.Так что измените согласно вашей длине

0 голосов
/ 17 мая 2019
  1. Открыть объект Диаграмма модели.
  2. Нажмите на столбец, который дает исключение.
  3. Увеличьте максимальную длину.
0 голосов
/ 07 февраля 2019

Для меня [MaxLength] не сработало.Я добавил ниже заявление к контексту.

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

Я не пытался превысить предел " 4000 ", но я думаю, что он может быть расширен дальше.Вам не нужно сохранять его 128 , как показала ошибка компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...