2009-08-06 146 views
1

我有一個WPF應用程序,遵循Model View ViewModel模式,使用實體框架與SQL 2008數據庫進行交互。更改實體框架中的關係/外鍵 - 未保持

問題

我的問題是在使用DATABSE EF我不能改變外鍵值。我有兩個實體:Site和Key。一個網站可以有很多密鑰。我想將密鑰從一個站點移到另一個站點。我試圖做到這一點使用下面的代碼:

keyToMove.Site = newSite; 
dataAccess.SaveChanges(); // this method just does: this.entities.SaveChanges(); 

我所觀察到

它出現在內存一切正常的應用程序的其他部分反映了這種變化(密鑰將出現在新網站下)。但是,數據庫中的外鍵不會更改,關閉並重新啓動應用程序後,所有更改都將丟失。

在「keyToMove.Site = newSite;」之後,keyToMove,newSite和舊的Site實例都有一個EntityState值爲「Unchanged」,這是不正確的。另外SaveChanges正在返回2,這隻會讓我更加困惑。

的制定者實施的「網站」屬性看起來像在我的模型等導航屬性:

set 
{ 
    ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Site>("CmsModel.SiteKeyAssociation", "Site").Value = value; 
} 

SQL事件探查表明,沒有任何類似的更新被髮送到數據庫引擎,只是一個很長很長選擇。也可以有基於條件的另一實體的效果

「鑰匙」實體繼承

觀光施加到列中的一個。

我正在使用AutoFac IOC容器來提供任何ViewModel誰想要做一些數據訪問與我的數據訪問類的實例(在該示例中的「dataAccess」)的引用。

ObjectContext實例是此類的成員(在註釋中顯示爲「this.entities」)。

dataAccess實例是Singleton Scoped,所以應該只有一個實例在View Models e.i中共享。 「keyToMove」和「newSite」都連接到相同的上下文。

對不起,這篇文章的長度,但我真的不知道這裏發生了什麼,我試圖提供儘可能多的細節,可能有所幫助。請詢問是否有進一步的信息可以幫助。

在此先感謝。

+0

調試通過屬性setter和確保this.ReportPropertyChanged()被調用。 – 2009-08-06 13:35:00

+0

它沒有,setter實現看起來與其他導航屬性相似,請參閱上面的編輯。 – andrej351 2009-08-06 22:57:43

+0

......呃,快速用完頭髮拉出來,請如果你有什麼想法,請點擊這裏 – andrej351 2009-08-07 01:43:33

回答

1

我正在自學自己的實體框架,所以我可能會錯過你的問題的重點,我當然不是專家。然而,這就是說,你可能會遇到一個問題,我必須通過自己的工作。

您沒有在您創建「newSite」變量的地方發佈代碼,但在EF中設置外鍵時,您的操作與Linq中的操作不同,或者只是在數據庫中工作。使用EF,您必須選擇您想要在對象上設置的外鍵值,然後進行設置。

這是行不通的:

NewSite = Site.CreateSite("PrimaryKeyValue"); 
keyToMove.Site = NewSite; 

相反,你做這樣的事情:

NewSite = MyEntities.Site.Where(site=>site.PrimaryKey==PrimaryKeyValue) 
           .FirstOrDefault(); 
keyToMove.Site = NewSite; 

我希望我理解您的問題!

的問候,在yourModel.Designer.cs 麥克

+0

這是真的; EF只會更新它認爲已經改變的屬性。如果您從數據庫實現keyToMove,那是自動的。如果您自己創建新的網站,則必須在附加到上下文之前設置舊網站,以便檢測到更改。 – 2009-08-13 01:08:22