2009-11-22 2 views
5

VS 2010 Beta 2, .NET 4.Entity Framework ошибка при подаче пустых полей

В моем ASP.NET MVC 2 приложения, когда я отправить форму к способу действий, который принимает объект, созданный в рамках объекта , я получаю следующее сообщение об ошибке:

Exception Details: System.Data.ConstraintException: This property cannot be set to a 
null value. 

Source Error: 


Line 4500:    OnTextChanging(value); 
Line 4501:    ReportPropertyChanging("Text"); 
Line 4502:    _Text = StructuralObject.SetValidValue(value, false); 
Line 4503:    ReportPropertyChanged("Text"); 
Line 4504:    OnTextChanged(); 

свойство называется «текст» и типа «текст NOT NULL» в MS SQL 2008.

Мои действия будет проверять, если значение nullorempty, если это будет ошибка модели, но я получаю ошибку, как только я отправлю форму.

+0

Возможно, это не связано напрямую с вашим вопросом, но тип данных TEXT устарел. У вас есть NVARCHAR (MAX) с SQL Server 2005. Его гораздо проще использовать во многих ситуациях. – LukLed

+0

Спасибо, я поменял свои поля на nvarchar (и обновил модель базы данных, используя мастер обновления сущности), но проблема все еще существует. – Omar

ответ

8

Вы связались непосредственно с объектом? Конечно, похоже. Таким образом, у вас есть два варианта:

  1. Напишите заказное связующее устройство, которое переводит null -> пустую строку.
  2. Привяжите к редактируемой модели, которая позволяет вместо нее вводить нули, а затем измените ее на пустую строку при копировании значений в объект в действии.

Я бы выбрал №2 лично. Я думаю, вы всегда должны использовать модели просмотра/редактирования, и это отличный пример того, почему.

2

Это проблема с MVC2 и Entity Framework 4 или это по дизайну? Похоже, что проверка свойств EF отлично работает для datetime не-нулевых (обязательных) полей, и проверка типов данных числовых и строковых полей работает без использования ViewModels.

Я воссоздал проблему, используя простую таблицу FOOBAR, используя одиночный, не нулевой столбцы varchar (50) с именем barName в slq 2008. Я сгенерировал EF-модель из этой базы данных и быстро добавил контроллер и представление CREATE для объект FOOBAR. Если я попытаюсь выполнить POST для действия CREATE без ввода значения для свойства barName, VS переходит в исключение в файле designer.cs модели (точно так же, как выше). Когда, я пытаюсь выйти за исключение, в форме появляется сообщение о проверке, а поле выделено розовым.

Кажется, что что-то не срабатывает в правильной последовательности. Поскольку исключение происходит до того, как VS переходит в метод HTTPPOST CREATE.

Я нашел код из примера ASP.Net MvcMusicStore полезным. http://mvcmusicstore.codeplex.com/releases/view/44445#DownloadId=119336

Похоже, что привязка к ViewModel устраняет проблему.

namespace MvcMusicStore.ViewModels 
{ 
    public class StoreManagerViewModel 
    { 
     public Album Album { get; set; } 
     public List<Artist> Artists { get; set; } 
     public List<Genre> Genres { get; set; } 
    } 
} 
........ 

namespace MvcMusicStore.Models 
{ 
    [MetadataType(typeof(AlbumMetaData))] 
    public partial class Album 
    { 
     // Validation rules for the Album class 

     [Bind(Exclude = "AlbumId")] 
     public class AlbumMetaData 
     { 
      [ScaffoldColumn(false)] 
      public object AlbumId { get; set; } 

      [DisplayName("Genre")] 
      public object GenreId { get; set; } 

      [DisplayName("Artist")] 
      public object ArtistId { get; set; } 

      [Required(ErrorMessage = "An Album Title is required")] 
      [StringLength(160)] 
      public object Title { get; set; } 

      [DisplayName("Album Art URL")] 
      [StringLength(1024)] 
      public object AlbumArtUrl { get; set; } 

      [Required(ErrorMessage = "Price is required")] 
      [Range(0.01, 100.00, ErrorMessage="Price must be between 0.01 and 100.00")] 
      public object Price { get; set; } 
     } 
    } 
} 
4

У меня была такая же проблема. Я огляделся и нашел здесь работу. Он описывает проблему как вызванную валидацией EF, имеющей место перед обязательной проверкой поля. Он также показывает, как мы можем обойти эту проблему, используя тег [DisplayFormat]. Надеюсь, что это поможет вам.

Вот ссылка на этот вопрос и обходной путь:

Server-side validation of a REQUIRED String Property in MVC2 Entity Framework 4 does not work

1

У меня была такая же проблема, и установил ее, сделав false к true, как это: ответ

Line 4502: 
_Text = StructuralObject.SetValidValue(value, false); 
1

Ашиша Шакья помогли меня. Я добавил этот атрибут к свойству, и теперь он работает.

[DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")] 

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

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
    [DataMemberAttribute()] 
    [DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")] 
    public global::System.String MyProperty 
    { 
     get 
     { 
      return _MyProperty; 
     } 
     set 
     { 
      OnMyPropertyChanging(value); 
      ReportPropertyChanging("MyProperty"); 
      _MyProperty = StructuralObject.SetValidValue(value, false); 
      ReportPropertyChanged("MyProperty"); 
      OnMyPropertyChanged(); 
     } 
    } 
1

Импорт пространства имен:

using System.ComponentModel.DataAnnotations; 

И добавить свойство атрибута [Required]

[Required] 
public global::System.String MyProperty 
    { 
     get 
     { 
      return _MyProperty; 
     } 
     set 
     { 
      OnMyPropertyChanging(value); 
      ReportPropertyChanging("MyProperty"); 
      _MyProperty = StructuralObject.SetValidValue(value, false); 
      ReportPropertyChanged("MyProperty"); 
      OnMyPropertyChanged(); 
     } 
    } 

Таким образом ModelState.IsValid равно ложь , показывая сообщение об ошибке в валидации и не выйдет из строя на сервере с помощью Null.

0

У меня была такая же проблема, и я пришел сюда, чтобы найти решение. Однако ответ может быть усилен.

Svavar's и HackITMngr были на правильном пути, однако сочетание обоих дает лучший результат. Вы не хотите украшать созданные классы, так как вы рискуете потерять свои пользовательские изменения при модификации модели EF.

[MetadataType (TypeOf (MyTableMetaData))] общественного частичного класса MYTABLE { правила // Validation для класса альбома

public class MyTableMetaData 
    { 
     [DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")] 
     public string MyTextProperty { get; set; } 
    } 
} 

Для урегулирования любых споров между ними. Я бы сказал, что Svavar's был прямым ответом, HackITMngr был улучшением.

Отлично подходит для меня!

0

Я установил свойство StoreGeneratedPattern как рассчитанное для каждого поля, и он решил проблему для меня.

Смежные вопросы