Закрытые поля, помеченные как WithEvents, используются Code First для создания автоматического иностранного - PullRequest
3 голосов
/ 22 января 2012

простой вопрос.

Учитывая следующий код:

Public Class MyClass
    Private WithEvents pPerClass As PersistableClass
    Public Overridable Property PerClass() As PersistableClass
        Get
            Return pPerClass
        End Get
        Set(value As PersistableClass)
            pPerClass= value
        End Set
    End Property

    'Other code
    '...

End Class

и

Public Class PersistableClass
    Public Property PersistableClassID as Integer
    'Other methods and properties
    '...
End Class

Когда MyClass сохраняется и база данных успешно создана с использованием Code First,в таблице MyClasses созданы следующие два внешних ключа:

  • pPerClass_PersistableClassID (FK, int, null)
  • PerClass_PersistableClassID (FK, int, null)

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

Если вы удалите ключевое слово WithEvents, ключ pPerClass_PersistableClassID не будет создан.

Я новичок в EFно мне кажется странным поведение.

Знаете ли вы какие-либо причины для этого?

1 Ответ

1 голос
/ 23 января 2012

Одной возможной причиной, которая приходит на ум, является побочный эффект от реализации WithEvents. Если вы откроете свой скомпилированный класс в декомпиляторе, вы увидите, что он создал свойство с именем поля WithEvents и создал собственное вспомогательное поле для свойства.

После того, как вы это увидели, вы, вероятно, сможете понять, почему это происходит, если подумаете о том, как реализовать ключевое слово WithEvents. Это дополнительное свойство используется, чтобы гарантировать, что соответствующие обработчики событий будут подключены и отсоединены при установке свойства.

Тем не менее, я ожидаю, что собственность будет частной и удивлена, что она влияет на EF, хотя я не использовал EF достаточно, чтобы действительно знать. Похоже, это означает, что WithEvents плохо работает с EF, и вам нужно перехватить обработчики событий вручную.

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