Обновленная информация об окончательном результате этого выпуска. После некоторых очень быстрых и полезных советов от команды EF в Microsoft было установлено, что это ожидаемое поведение от EF 3.5 SP1:
"Когда вы запрашиваете в слое обслуживания для Заявителя, где все языки одинаковы, вы получаете два объекта, один Заявитель со всеми тремя свойствами навигации, указывающими на один и тот же объект CodeLanguage. Затем WCF создает его заново тот же график на клиенте, означающий, что три заданные вами точки останова действительно смотрят на одно и то же свойство одного и того же объекта "
Microsoft предоставила основу для моего окончательного решения, а именно:
Первое: Создайте частичный класс для объекта данных Applicants и создайте три свойства, которые ссылаются на три языка code_ids:
Частично заявители в публичном классе
Private _intPrefCoorespLanguage As Integer = 0
Private _intPrefInterviewLanguage As Integer = 0
Private _intPrefExamLanguage As Integer = 0
<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefCoorespLanguageCodeId() As Integer
Get
Return (_intPrefCoorespLanguage)
End Get
Set(ByVal value As Integer)
_intPrefCoorespLanguage = value
End Set
End Property
<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefInterviewLanguageCodeId() As Integer
Get
Return (_intPrefInterviewLanguage)
End Get
Set(ByVal value As Integer)
_intPrefInterviewLanguage = value
End Set
End Property
<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefExamLanguageCodeId() As Integer
Get
Return (_intPrefExamLanguage)
End Get
Set(ByVal value As Integer)
_intPrefExamLanguage = value
End Set
End Property
<OnSerializing()> _
Private Sub PopulateClientProperties(ByVal sc As StreamingContext)
Me.MyPrefCoorespLanguageCodeId = Me.PrefCoorespLanguage.code_lang_id
Me.MyPrefInterviewLanguageCodeId = Me.PrefInterviewLanguage.code_lang_id
Me.MyPrefExamLanguageCodeId = Me.PrefExamLanguage.code_lang_id
End Sub
Конечный класс
Секунда: Перекомпилируйте и обновите ссылку на службу клиента. Используйте три свойства code_id языка для привязки к элементам управления в xaml
Третье: В обновлении на стороне сервера выполните следующее, чтобы обновить внешние ключи applciant и его языка:
myContext = New HR2009Entities
'Get original Applicant and feed in changes from detatched updated Applicant object
Dim OrigApp = (From a In myContext.Applicants Where a.applicant_id = pobjUpdatedApplicant.applicant_id Select a).First
'Apply preferred language foreign key refs
OrigApp.PrefCoorespLanguageReference.EntityKey = _
New EntityKey("HR2009Entities.CodeLanguages", "code_lang_id",pobjUpdatedApplicant.MyPrefCoorespLanguageCodeId)
OrigApp.PrefInterviewLanguageReference.EntityKey = _
New EntityKey("HR2009Entities.CodeLanguages", "code_lang_id", pobjUpdatedApplicant.MyPrefInterviewLanguageCodeId)
OrigApplicant.PrefExamLanguageReference.EntityKey = _
New EntityKey("HR2009Entities.CodeLanguages", "code_lang_id", pobjUpdatedApplicant.MyPrefExamLanguageCodeId)
'Apply Applicant table native-field changes
myContext.ApplyPropertyChanges(OrigApp.EntityKey.EntitySetName, pobjUpdatedApplicant)
'Save to database
myContext.SaveChanges()
myContext.Dispose()