4

У меня возникли проблемы с (2) полей при сохранении объектов в моем ASP.NET MVC4 приложения:Ошибка при сохранении поля с помощью специальных символов, используя EntityFramework и MVC ModelBinding

  • электронной
  • телефона

Как известно, эти поля будут иметь специальные символы @ и - обычно. Вот мой код из контроллера ValueInjecter вводить свои классы модели из гидратированного объекта с помощью модели Переплет:

public ActionResult Create(TestViewModel testViewModel) 
{ 
    using (var context = new MyEntities()) 
    { 
    var person = new Person(); 
    person.InjectFrom(testViewModel); 
    context.Person.AddObject(person); 
    context.SaveChanges(); 
    } 
} 

Ошибка я получаю следующие:

«Строка или двоичные данные будут усечены. заявление было прекращено»

Ok на 1-й взгляд, вы могли бы сказать, что это размер поля в SQL, но истинная проблема замаскарадены из-за этих специальных charachters. Если я ввожу следующее для полей:

телефон: 11234565454514564561
электронная почта: blahblahblahblah

... тогда все работает.

Однако, если я вхожу:

телефон: 123-456-7890
электронная почта: [email protected]

Я получаю ошибку о "String или двоичные данные будут усечен". Поэтому я нашел работу, но это кажется совершенно ненужным и, вероятно, неправильным. Если я явно сопоставить значения от модели связанного объекта в сущности, используя символы C# побега, то мои ценности вставит, как показано ниже:

public ActionResult Create(TestViewModel testViewModel) 
{ 
    using (var context = new MyEntities()) 
    { 
    var person = new Person(); 
    person.InjectFrom(testViewModel); 

    //Explicitly map items preserving special charachters 
    person.EmailAddress = @testViewModel.EmailAddress; 
    person.Phone = @testViewModel.Phone; 

    context.Person.AddObject(person); 
    context.SaveChanges(); 
    } 
} 

ОК, так что если честно, я не знаю, где виновником лжи , Является ли это проблемой привязки модели MVC, проблемой Entity Framework, транзакцией на C# или ValueInjecter? Я попытался использовать аннотации для своих свойств ViewModel, чтобы диктовать типы данных, такие как Phone и Email, но это не остановило проблему. Это было сделано, только будучи явным в коде, избегая этих символов.

Что я делаю неправильно, потому что знаю, что поля, такие как электронная почта и телефон со специальными символами, сохраняются все время в EF с помощью MVC? Что я могу сделать, чтобы избежать необходимости посыпать эти строки кода каждый раз, когда у меня есть значение со специальным символом?

Спасибо!

+1

_ "используя escape-символы C#" _ - нет, это только при применении '@' к [литералу строки verbatim] (http://msdn.microsoft.com/en-us/library/362314fe.aspx) ('@" C: \ Foo.bar ") или если вы хотите использовать [ключевое слово как идентификатор] (http://msdn.microsoft.com/en-us/library/x53a06bb) (' string @ string'). Хлопание символа '@' перед именем переменной ничего не делает для содержимого этой переменной. Просто запустите SQL Profiler и посмотрите, какой запрос отправлен на сервер. – CodeCaster

+0

Что такое тип данных для электронной почты и телефона – swapneel

+0

'<Имя свойства =" Телефон "Тип =" nvarchar "MaxLength =" 25 "/>' '<Имя свойства =" EmailAddress "Тип =" nvarchar "MaxLength =" 50 "/> ' – atconway

ответ

2

Ну в типичном фьюжн я понять это через 10 секунд после размещения на вопрос, который я провел 3 часа, пытаясь выяснить:

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

Код, который я дал, был сжат для краткости, но я вводил в (2) разные лица: Человек и Контакт.Оказывается, таблицы имеют поле «Название». Я был сосредоточен только на поле «Заголовок» в таблице Person, который имел длину «50», как показано ниже:

<Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="50" />

Оказывается Контактное поле имело точное smae поля я не знал, но только длина «8», как показано ниже:

<Property Name="Title" Type="nvarchar" MaxLength="8" />

Это вызвало ошибку, и это было действительно законным. ValueInjecter сопоставил одно и то же одно значение «Название» для обоих объектов, когда я только хотел его и вызвал проблему. Должны быть осторожны, потому что ValueInjectoer не различает, если имена совпадают (как и должно быть), но это вызывает мою проблему.