2015-01-11 3 views
-1

Моя проблема возникает в приложении Windows Phone 8.1 Silverlight VB. CatDataContext определяет таблицу Books с элементами Title и внешним ключом _seriesID, который принадлежит к таблице Series.SubmitChanges не обновляет внешний ключ базы данных

<Table()> 
    Public Class Series 
     Implements INotifyPropertyChanged, INotifyPropertyChanging 
     ' Define ID: private field, public property, and database column. 
     Private _seriesID As Integer 

     <Column(IsPrimaryKey:=True, IsDbGenerated:=True, DbType:="INT NOT NULL Identity", CanBeNull:=False, 
      AutoSync:=AutoSync.OnInsert)> 
     Public Property SeriesID() As Integer 
      Get 
       Return _seriesID 
      End Get 
      Set(ByVal value As Integer) 
       If _seriesID <> value Then 
        NotifyPropertyChanging("SeriesID") 
        _seriesID = value 
        NotifyPropertyChanged("SeriesID") 
       End If 
      End Set 
     End Property 

     ' Define name: private field, public property, and database column. 
     Private _Name As String 
     <Column()> 
     Public Property Name() As String 
      Get 
       Return _Name 
      End Get 
      Set(ByVal value As String) 
       If _Name <> value Then 
        NotifyPropertyChanging("Name") 
        _Name = value 
        NotifyPropertyChanged("Name") 
       End If 
      End Set 
     End Property 

#Region "INotifyPropertyChanged Members" 

     Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

     ' Used to notify that a property changed 
     Private Sub NotifyPropertyChanged(ByVal propertyName As String) 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
     End Sub 

#End Region 

#Region "INotifyPropertyChanging Members" 

     Public Event PropertyChanging As PropertyChangingEventHandler Implements INotifyPropertyChanging.PropertyChanging 

     ' Used to notify that a property is about to change 
     Private Sub NotifyPropertyChanging(ByVal propertyName As String) 
      RaiseEvent PropertyChanging(Me, New PropertyChangingEventArgs(propertyName)) 
     End Sub 

#End Region 

    End Class 

    <Table()> 
    Public Class Book 
     Implements INotifyPropertyChanged, INotifyPropertyChanging 

     ' Define ID: private field, public property, and database column. 
     Private _bookID As Integer 
     <Column(IsPrimaryKey:=True, IsDbGenerated:=True, DbType:="INT NOT NULL Identity", CanBeNull:=False, 
      AutoSync:=AutoSync.OnInsert)> 
     Public Property BookID() As Integer 
      Get 
       Return _bookID 
      End Get 
      Set(ByVal value As Integer) 
       If _bookID <> value Then 
        NotifyPropertyChanging("BookID") 
        _bookID = value 
        NotifyPropertyChanged("BookID") 
       End If 
      End Set 
     End Property 

     ' Define title: private field, public property, and database column. 
     Private _title As String 
     <Column()> 
     Public Property Title() As String 
      Get 
       Return _title 
      End Get 
      Set(ByVal value As String) 
       If _title <> value Then 
        NotifyPropertyChanging("Title") 
        _title = value 
        NotifyPropertyChanged("Title") 
       End If 
      End Set 
     End Property 

     ' Internal column for the associated series ID value. 
     <Column()> 
     Friend _seriesID As Integer 
     Private _series As EntityRef(Of Series) 
     <Association(Storage:="_series", ThisKey:="_seriesID", OtherKey:="SeriesID")> 
     Public Property BookSeries() As Series 
      Get 
       Return _series.Entity 
      End Get 
      Set(ByVal value As Series) 
       NotifyPropertyChanging("BookSeries") 
       _series.Entity = value 
       If value IsNot Nothing Then 
        _seriesID = value.SeriesID 
       End If 
       NotifyPropertyChanged("BookSeries") 
      End Set 
     End Property 

#Region "INotifyPropertyChanged Members" 

     Public Event PropertyChanged As PropertyChangedEventHandler Implements NotifyPropertyChanged.PropertyChanged 

     ' Used to notify that a property changed 
     Private Sub NotifyPropertyChanged(ByVal propertyName As String) 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
     End Sub 

#End Region 

#Region "INotifyPropertyChanging Members" 

     Public Event PropertyChanging As PropertyChangingEventHandler Implements INotifyPropertyChanging.PropertyChanging 

     ' Used to notify that a property is about to change 
     Private Sub NotifyPropertyChanging(ByVal propertyName As String) 
      RaiseEvent PropertyChanging(Me, New PropertyChangingEventArgs(propertyName)) 
     End Sub 

#End Region 

Обновление только поля Название или поля Название и _seriesID работает отлично. Однако, когда я изменяю только _seriesID, обновление базовой базы данных не выполняется. В этом случае .GetModifiedMembers не показывает никаких изменений.

Ссылка на демонстрационный проект, показывающий эту проблему, приведена здесь: demo project.

Спасибо за внимание.

+1

Пожалуйста, укажите соответствующий код в своем вопросе, а не в отдельной ссылке. И обратите внимание на форматирование и абзац. –

+0

Вы добавили 'Friend _seriesID' самостоятельно? –

+0

Я использовал это по аналогии с примером Microsft «Как создать локальное приложение базы данных с MVVM для Windows Phone 8». – hwjSoftware

ответ

0

_seriesID (in Book) всего лишь переменная члена. Вы можете установить его извне Book, потому что это Friend, но дальше ничего не происходит.

Title, с другой стороны, является объект, который стреляет NotifyPropertyChanged. Это означает, что контекст уведомляется о том, что объект Book был изменен, если вы изменили Title.

Так что если вы измените _seriesIDиTitle, то Book объект помечается как изменен и сохранен, наряду с измененным значением _seriesID. Но если вы измените только _seriesID, объект останется «неизменным».

Я думаю, что это сгенерированный код (LINQ-to-SQL? Я его не знаю), и вы не должны изменять его вручную. Если вы хотите изменить _seriesID, вы должны установить BookSeries.

+0

Большое спасибо за ваши усилия, Герт. Я изучу это дальше и дам вам знать на этой платформе. – hwjSoftware

+0

Опять же, я был очень доволен ваш ответ объясняет, почему _seriesID не запускает NotifyPropertyChanged. Я не знаю, как это сделать. BookSeries - это другая таблица, которую я не хочу изменять. Я просто хочу, чтобы _seriesID в Books ссылался на другую строку в Таблицы Bookseries. – hwjSoftware

+0

Теперь у меня есть возможности: 1) Каждый раз, когда _seriesID изменяется, также Title будет изменен добавлением символа, а после SaveChangesToDB Title будет восстановлен (который я использую сейчас без проблем) 2) измените в CatDataContext определение _seriesID в общедоступное свойство (а не ключ). 3) Исследуйте, можно ли использовать соединение двух таблиц. Я до сих пор не мог найти полезную информацию по этому вопросу для V B. – hwjSoftware

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