2

Существует класс - это не общий класс ничего особенного:Code First Fluent API проверки не работает

public class Trader{ 

public Guid UserId {get;set;} 
public int TraderId { get; set; } 
public string FirstName { get; set; } 
public string LastName { get; set; } 
public string PhoneNumber { get; set; } 
public string Skype { get; set; } 
public string Photo { get; set; } 
public string Email { get; set; } 

public virtual User User { get; set; } 
} 

Mapping:

public TraderMap() 
     { 
      this.ToTable("Trader", "General"); 
      this.HasKey(a => a.TraderId); 
      this.HasRequired(a => a.User).WithMany().HasForeignKey(a => a.UserId); 
      Property(a => a.UserId).HasColumnName("UserID").IsRequired(); 
      Property(a => a.TraderId).HasColumnName("TraderID").IsRequired(); 

      Property(a => a.FirstName).HasMaxLength(50).IsRequired(); 
      Property(a => a.LastName).HasMaxLength(50).IsRequired(); 
      Property(a => a.PhoneNumber).HasMaxLength(25).IsRequired(); 
      Property(a => a.Skype).HasMaxLength(50).IsOptional(); 
      Property(a => a.Photo).HasMaxLength(100).IsOptional(); 
      Property(a => a.Email).HasMaxLength(100).IsRequired(); 
     } 

Когда я оставляю ПгвЬЫате или другие поля, которые имеют требуется копаться () пустым в форме (View), проверка не влезает. Он просто сталкивается с ошибкой:

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

К сожалению, эта ошибка не говорит слишком много. Я копать немного глубже, но единственное, что я смог был

Invalid column name discriminator.

Я думал, что это будет какая-то забыто наследство где-то (для класса пользователя), но я не нашел ничего подозрительного.

Проблема в том, что когда я использую атрибуты в классе Trader, все работает так, как предполагалось.

public class Trader{ 

    public Guid UserId {get;set;} 
    public int TraderId { get; set; } 
    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
    [Required] 
    public string PhoneNumber { get; set; } 
    public string Skype { get; set; } 
    public string Photo { get; set; } 
    [Required] 
    public string Email { get; set; } 

    public virtual User User { get; set; } 
    } 

С атрибутами проверка работает нормально и @ Html.ValidationMessageFor начинает выводить сообщения об ошибках и не позволяет посылать NULL значения.

Есть ли у вас какие-либо предположения, в чем проблема с моим картографированием?

ОБНОВЛЕНИЕ 1 Фактически перечисленные выше признаки являются возможным решением этой проблемы.

+0

Можете ли вы опубликовать свой класс пользователя и картографирование? –

+1

Не понимаю. Очевидно, что проверка * IS * работает, когда вы пытаетесь вставить заготовки, ошибка «Ошибка проверки», поэтому проверка работает нормально. –

+0

«Ошибки проверки, созданные на основе конфигураций Fluent API, не будут автоматически достигать пользовательского интерфейса, но вы можете записать его в код, а затем отреагировать на него соответствующим образом». от https://msdn.microsoft.com/en-au/data/gg193959.aspx?f=255&MSPPError=-2147217396 –

ответ

1

Вы оба были правы, я был под ложным допущением.

[Требуется] не является эквивалентом .IsRequired()

Есть несколько возможных решений:

1) Быстрый & легко: Attributes

Model Configuration overrides and Validation

With CodeFirst it is possible to override the configuration of the model defined with validation attributes, e.g. in the OnModelCreating method. Reconfiguring model affects validation since validation should use the actual model configuration – blindly use of attributes would cause validation errors for values that could be valid according to the overrides made in OnModelCreating(). Here are the three special cases for overrides made in OnModelCreating:

  • If a property was decorated with [Required] attribute and was reconfigured as optional (.IsOptional() method) the [Required] attribute will be removed and as a result ignored when validation happens

  • If a property was decorated with [StringLength] or [MaxLength] attribute and then was configured with new length (.HasMaxLength() method) new maximum length will be used if possible

  • If a property was decorated with [StringLength] or [MaxLength] attribute and then was defined to be allowed maximum length (.IsMaxLength) then the attribute will be removed (if possible) and the length of the property value will not be checked

Note that the above changes will be effective only if a property was decorated with some validation attributes. So, setting property as required (.IsRequired()) will not cause the property be validated against null value.
See EF Feature CTP5: Validation

2) Быстрое исправление, но это грязный, как Mystere Man предложил
http://thedatafarm.com/blog/data-access/capturing-code-first-fluent-api-validationresults-to-display-in-mvc3-views/

http://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.html

3) Тяжелый один: The Validation Application Block in Enterprise Library
http://bradwilson.typepad.com/blog/2009/10/enterprise-library-validation-example-for-aspnet-mvc-2.html но Enterprise Library очень часто рассматривается как массовое убийство

4) Validation нирвана: FluentValidation выглядит очень перспективным и Я обязательно попробую.
http://www.nuget.org/packages/FluentValidation.MVC3
Против: Не лучший подход в приложении n-layer. Основное внимание уделяется представлениям.

5) N-слой
http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validating-with-a-service-layer-cs
Этот подход приводит к проблемам с проверкой на стороне клиента, поэтому он должен быть решен отдельно.

+0

Это не решение. Это обходной путь. Очень плохая практика - использовать исключения для решения ожидаемых (и общих) ситуаций. Исключения есть, как следует из названия, Исключительно. То есть, они должны появляться только тогда, когда происходит незапланированное событие. Это очень плохой выбор для решения проблемы. –

+0

Ну, он очень хорошо ответил на мой вопрос, и в обсуждении есть ссылка на блог Брэда Уилсона http://bradwilson.typepad.com/blog/2010/10/service -location-pt6-model-validation.html, это хорошее начало. – nubm

4

Проверка выполняется только в том случае, если вы используете «аннотации данных» - в то время как HasRequired атрибуты сопоставления - данные аннотации выполняют как отображение, так и часть проверки.
т. Е. Для ваших взглядов, чтобы подтвердить, что я считаю, что вам придется размещать аннотации/атрибуты в ваших свойствах.

Это часто используется, чтобы «различать» между «отображением» и отображением и проверкой. т. е. если вы хотите, чтобы оба использовали атрибуты, если вы хотите, чтобы только сопоставление использовало свободную конфигурацию.

Связанный ответ здесь также https://stackoverflow.com/a/9310435/417747 или https://stackoverflow.com/a/9789984/417747

EDIT: и это один еще ближе к тому, что вам нужно, благодаря Джастину
How to make Fluent API configuration work with MVC client side validation?

3

Я думаю, что вы путаете проверки EF Модель с проверкой MVC , MVC ничего не знает о EF или наоборот. Это разные технологии, которые хорошо работают вместе.

Когда вы определяете валидацию на свободной модели данных, вы определяете только проверку для Entity Framework. Это явно работает, когда вы пытаетесь сохранить изменения, EF выходит из строя и жалуется, что проверка не выполнена.

Опять же, это не имеет никакого отношения к проверке MVC, и эти два не работают вместе по большей части (одним исключением является то, что если вы используете класс POCO и используете аннотации данных, некоторые из аннотаций работают как в MVC и EF, но некоторые нет. Нехорошо использовать модель данных прямо в своем представлении, так что это в значительной степени спорный вопрос.)