Присвоить пустую строку свойству с текущим значением ничего - PullRequest
3 голосов
/ 05 января 2011

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

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 для свойства со значением none, и я не хочу помнить, что я должен делать это каждый раз, потому что я почти уверен, чтоЯ забуду об этом, а затем я внесу ошибки в код.Я просто хочу присвоить свойству значение empty.string, и свойство принимает «» в качестве значения.

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

Ответы [ 2 ]

2 голосов
/ 05 января 2011

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

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

Редактировать - добавить немного больше деталей

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

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

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

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

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

Кстати, если вы хотите больше на Т4, посетите блог Олега Сыча, http://www.olegsych.com/tag/t4/.

1 голос
/ 05 января 2011

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

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

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

/ EDIT: подать отчет об ошибке. Генератор, сгенерировавший этот код, не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...