2009-08-05 110 views
2

我使用EF(框架3.5 SP1)的多個外鍵奇怪的問題,有一個簡單的兩個表演示設置:實體框架 - 映射到同一個表

申請人

  • 申請人-ID詮釋
  • 申請人-PREF琅coorepondence INT(FK到CodeLanguages)
  • 申請人-PREF琅考試INT(FK到CodeLanguages)
  • 申請人-PREF琅面試INT(FK到CodeLanguages )

CodeLanguages

  • 代碼琅ID INT
  • 代碼琅降序VARCHAR

甲CodeLanguage條目可以具有0,1 *申請人

申請人中的每種語言參考文獻必須有1(且只有一個)CodeLanguage ref。

問題: 當我將一個申請實體(通過WCF Web服務返回到我的基於WPF的客戶端)時,如果所有三種語言引用(coorespondence,考試和麪試)都相同,則可以說1000(english ),然後我修改它們中的一個,例如1001(法語),然後所有THREE將改爲1001(法語)。如果所有三個引用都不同(讓我們說coorespondence = english,exam =法語,和採訪=西班牙語),我改變了其中一個 - 然後它的行爲如預期,只有我改變的是受到影響 - 其他人仍處於原始狀態。

我大部分時間都在嘗試各種各樣的東西,比如在EDMX中刪除和重新創建關聯,重新創建EDMX數據模型 - 甚至創建一個新的數據庫。這一切都沒有奏效 - 我開始面臨的問題是EF和不是我的代碼。

任何想法?謝謝。

回答

1

在這個問題上的最終結果的更新。在微軟的EF團隊提供了一些非常快速和有用的建議後,確定這是EF 3.5 SP1的預期行爲:

「當您在申請人的服務層中查詢所有語言相同時,包含兩個對象,一個申請人具有指向相同CodeLanguage對象的所有三個導航屬性。WCF然後重新創建客戶端這意味着你設置三個斷點確實在看相同的屬性相同的對象」上

微軟提供給我的最終解決方案的基礎是此此同一張圖:

第一:創建申請人數據對象的部分類和創建哪個參考三個語言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() 
0

那麼你是對的這聽起來很奇怪。

我試圖根據您所解釋的內容重新制作您的問題,但不能。

如果您有一個小的repro,但我會研究這一點。

如果你願意,你可以給我發電子郵件(alexj)@ microsoft.com。

亞歷克斯·詹姆斯

項目經理實體框架團隊

+0

亞歷克斯 - 已通過電子郵件通知您有詳細的描述 – Gatmando 2009-08-06 01:50:46