2011-01-05 1 views
3

В моей EF4 EntityModel У меня есть сущность с именем USERS. У ПОЛЬЗОВАТЕЛЕЙ есть общие поля UserName и Password string. Если я сделаю что-то вроде этого:Назначить пустую строку для свойства с текущей стоимостью ничего

Dim u as new USERS 
U.UserName = String.Empty 

Тогда U.UserName все еще ничего. Но если я что-то вроде этого:

Dim u as new USERS 
u.UserName = “A” 
u.UserName = String.Empty 

затем U.UserName принимает String.Empty как значение без проблем.

Причина заключается в том, что путь EF4 генерирует UserName свойство

Public Property UserName() As Global.System.String 
    Get 
     Return _UserName 
    End Get 
    Set 
     If (_UserName <> Value) Then ‘Here is the key 
      OnUserNameChanging(value) 
      ReportPropertyChanging("UserName") 
      _UserName = StructuralObject.SetValidValue(value, false) 
      ReportPropertyChanged("UserName") 
       OnUserNameChanged() 
      End If 
     End Set 
    End Property 

Мой вопрос:

Как я могу справиться с этим?

Есть ли что-то, что я могу сделать, чтобы избежать такого поведения? Я не хочу делать два присваивания каждый раз, когда хочу установить string.empty для свойства с ничтожным значением, и я не хочу вспоминать, что я должен делать это таким образом каждый раз, потому что я уверен, что Я забуду это, а затем я введу ошибки в код. Я просто хочу присвоить значение empty.string свойству, а свойство принимает значение «».

Как я пришел из C#, и я новичок в vb.net, я очень надеюсь, что у меня что-то не хватает.

+0

Спасибо SLaks ... Я пытался отформатировать этот код в течение 10 минут ... – Jonathan

+0

В чем смысл? Вам нужно поведение OnPropertyChanged (например, в приложении WPF со связыванием)? В качестве альтернатив есть 3 шаблона кода gen, и это будет определять, какой из них для вас. – RichardW1001

+0

@ RichardW1001: мне не нужен интерфейс OnPropertyChanged, я просто выбираю шаблон defalt, потому что я начинаю с EF4. – Jonathan

ответ

2

Вы определенно хотите назначить пустую строку вместо пустого значения? Если нет, вы можете просто установить свойство nullable?

В любом случае вы можете манипулировать кодом, создаваемым EF, с использованием шаблонов T4 (VS называет их генераторами кода), поэтому вы можете изменить реализацию setter свойств, что бы вы хотели, выполнив это.

Edit - добавление немного более подробно

Если вы используете генератор POCO, вы получите простые свойства, то есть ни одно из свойств не изменилось и т.д.

Если вы используете генератор EntityObject, это в основном позволяет редактировать поколение вы в настоящее время имеете. Если вы используете добавление T4 для визуальной студии, вы получаете подсветку синтаксиса на T4, в VS2010 добавляются некоторые бесплатные дополнения, которые очень хороши. У вас в основном есть код, который генерирует там код, который вы можете настроить.линия вы помечены на линии 523:

If (<#=code.FieldName(primitiveProperty)#> <> Value) Then 

Вы могли бы попытаться сделать что-то в стиле фанка в зависимости от типа, или вы могли бы просто возврат к использованию Object.Equals(), или то, что вы хотите, вместо этой строки , Или вы можете полностью удалить раздел If, но это может иметь другие последствия. Когда вы сохраните шаблон T4, он обновит все сгенерированный код для вас.

В зависимости от того, что вы на самом деле делаете, шаблон POCO может излечить вашу проблему.

BTW, если вы хотите узнать больше о T4, посетите блог Олега Сыха, http://www.olegsych.com/tag/t4/.

+0

Конечно, я мог бы изменить шаблон T4 или даже написать какой-то рабочий стол. Первый вариант будет включать слишком много сложностей (распространение шаблона по команде разработчиков и т. Д.), А второй - не изящный. Я сказал, что у меня что-то не хватает, но если это не так, нет другого выбора, я выберу одну из альтернатив. Основная цель состоит в том, чтобы избежать того, что это поведение по умолчанию не вызывает ошибок в наших кодах, bacause. Описанная ситуация происходит во всех объектах модели. – Jonathan

+0

Звучит как сильный футляр для ванильного генератора POCO. Кстати, шаблон T4 находится в вашем решении, поэтому его распространение не обязательно будет большой проблемой. Удачи! – RichardW1001

+0

Спасибо за детали! : D Я буду искать шаблон и указанную строку. Я использую редактор Tangible для шаблонов T4, чтобы получить подсветку синтаксиса. Я делал некоторые шаблоны T4 в прошлом, поэтому я думаю, что это может быть способ решить проблему. Я не могу использовать POCO, потому что мне нужно постоянство объекта. – Jonathan

1

Проблема в том, что сравнение строк в VB обрабатывает Nothing и пустую строку как равную. Вы можете обойти это, явно используя String.Equals. еще

If Not String.Equals(_UserName, Value) Then … 

Лучше, запретить Nothing значения полностью и инициализировать поле внутри класса к значению "" (или String.Empty, если вы должны ... что более или менее эквивалент).

/EDIT: файл с сообщением об ошибке. Генератор, генерирующий этот код, сломан.

+0

Нет, он не может. Это автоматически сгенерированный код. – SLaks

+0

@SLaks: тогда генератор сломан. :-( –

+0

Не изменяйте это на отдельных сгенерированных классах, так как в следующий раз, когда вы сохраните свою модель, они перепишут! Кроме того, это работает только для String, тогда как сгенерированная EF реализация должна быть общей, поскольку она имеет дело со всеми значения – RichardW1001

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