2013-07-30 2 views
5

У меня есть автогенерированная модель Entity Framework. Он был сгенерирован с использованием первого подхода к базе данных. Столбец mid_initial имеет ограничение по базе данных, которое ограничивает колонку максимальной длиной 3 символа.База данных Первая проверка

//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated from a template. 
// 
// Manual changes to this file may cause unexpected behavior in your application. 
// Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace Agency.DataAccess.RegistrationModel 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Registrant 
    { 
     public Registrant() 
     { 
     } 

     public int id { get; set; } 
     public string fname { get; set; } 
     public string mid_initial { get; set; } 
     public string lname { get; set; } 
    } 
} 

Когда я пытаюсь создать модель с mid_initial больше чем 3 персонажей, недопустимое состояние, ModelState.IsValid возвращается правда. Из-за этого вызывается db.SaveChanges, который затем поднимает DbEntityValidationException.

[HttpPost] 
public ActionResult Create(Registrant registrant) 
{  
    try 
    { 
     if (ModelState.IsValid) 
     { 
      Debug.WriteLine("Entity was valid."); 
      db.Registrants.Add(registrant); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View("Create", registrant); 
    } 
    catch (DbEntityValidationException e) 
    { 
     foreach (var eve in e.EntityValidationErrors) 
     { 
      Debug.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
       eve.Entry.Entity.GetType().Name, eve.Entry.State); 
      foreach (var ve in eve.ValidationErrors) 
      { 
       Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
        ve.PropertyName, ve.ErrorMessage); 
      } 
     } 
     return View(registrant); 
    } 
} 

Почему метод ModelState.IsValid возвращает true? Казалось бы, моя модель не знает ограничения максимальной длины. Как мне это узнать?

ответ

4

EF db-first не может вызывать ограничения из базы данных.

Используйте MaxLenght данные атрибутов аннотаций:

public partial class Registrant 
{ 
    public Registrant() 
    { 
    } 

    public int id { get; set; } 
    public string fname { get; set; } 
    [MaxLength(3, ErrorMessage = "")] 
    public string mid_initial { get; set; } 
    public string lname { get; set; } 
} 

Примечание: этот класс является автогенерируемая класс и каждый раз, когда вы обновляете и сохраните модель (EDMX-файл), этот код будет переписан и вы Вы потеряете свои атрибуты.

Чтобы этого избежать, вы должны расширить свои классы с частичных классов с тем же именем и тем же пространством имен, что и ваши автоматически сгенерированные классы. Если вам нужны примеры, чтобы показать вам, как, скажите, чтобы я ответил им.

+0

Закрыть ... Но, как я понимаю, это не сработает. Компилятор скажет: «Ошибка 2 Тип« Регистрант »уже содержит определение для« mid_initial »...). Необходимо пометить класс« Регистрант »атрибутом« MetadataType »и создать еще один класс для проверки. Http: // stackoverflow. ком/вопросы/25722866/EF5-дб-первая сгенерированная-модель-и-заказ проверка/25741213 # 25741213 –

3

MVC является EF-агностиком и, как таковой, не подразумевает попытку проверки модели с использованием проверки EF для заполнения своего ModelState.

У вас есть четыре основных решений я могу думать прямо сейчас:

  • подключить их самостоятельно, например, с помощью MVC фильтров, DbContext.GetValidationErrors и ModelState.
  • Найти и использовать сторонний код, который делает это уже.
  • Подтвердите код отдельно, используя средства, которые может использовать MVC, например, с помощью DataAnnotations. Вы можете попытаться создать их автоматически, изменив шаблон EF T4. Обратите внимание, что это по-прежнему технически избыточно (код будет проверяться дважды, один раз MVC, один раз EF).
  • Отправить патч для MVC, чтобы он мог поддерживать EF явно (как soft зависимости) и заставить все это работать (оба проекта с открытым исходным кодом) - или downvote меня, потому что они уже сделали это, и я никогда не знал Это.