Entity Framework Проверка путаницы - максимальная длина строки "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; }
}
Поле "Тело" в фактической базе данных имеет тип 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>
Пример метода 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");
}
И, наконец, метод, который на самом деле выполняет работу grunt:
public void Update(T Entity)
{
dbset.Attach(Entity);
db.Entry(Entity).State = System.Data.EntityState.Modified;
db.Commit();
}
Я ничего не вижу в коде или в базе данных, которая может вызвать проблему, и где еще я должен выглядеть?
Ответы
Ответ 1
По умолчанию длина строкового поля в коде сначала равна 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
Если вы получите эту ошибку с использованием подхода Model First, проверьте модель EF: может быть просто, что свойство в обновляемом объекте имеет набор атрибутов Max Length
.
Ответ 3
Возможно, вы использовали
Property(m => m.Body ).IsRequired().HasMaxLength(128);
В вашем классе dbcontext в OnModelCreating.
Так что измените свою длину
Ответ 4
Для меня [MaxLength]
не сработало. Я добавил ниже выражение в контекст.
modelBuilder.Entity<YourModel>().Property(e => e.YourColumn).HasMaxLength(4000);
Я не пытался превысить " 4000 " предел, но я думаю, что он может быть продлен дальше. Вам не нужно держать его 128, как показала ошибка компилятора.
Ответ 5
- Открытая сущность Модель диаграммы.
- Нажмите на столбец, который дает исключение.
- Увеличьте его максимальную длину.