2009-08-06 3 views
1

Ich habe eine WPF-App, die dem Model View ViewModel-Muster folgt und das Entity Framework verwendet, um mit einer SQL 2008-Datenbank zu interagieren.Ändern einer Beziehung/eines Fremdschlüssels in Entity Framework - wird nicht beibehalten

Problem:

Mein Problem ist, ich keinen Fremdschlüsselwert in der databse mit EF ändern kann. Ich habe zwei Entitäten: Site und Key. Eine Site kann viele Schlüssel enthalten. Ich möchte einen Key von einer Site zur anderen verschieben. Ich versuche, diese mit dem folgenden Code zu tun:

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

Was ich

Es erscheint im Speicher alles Beobachtet habe, ist fein wie der Rest der App diese Änderung widerspiegelt (die Der Schlüssel erscheint unter der neuen Site). Der Fremdschlüssel in der Datenbank ändert sich jedoch nicht und beim Schließen und Neustarten der App gehen alle Änderungen verloren.

Nach „keyToMove.Site = newSite;“, keyToMove, newSite und die alte Site-Instanz alle einen EntityState Wert von „Unverändert“, das kann nicht richtig sein. Auch SaveChanges gibt 2 zurück, was mich nur noch weiter verwirrt.

Die Setter-Implementierung für die „Site“ Eigenschaft sieht aus wie andere Navigationseigenschaften in meinem Modell:

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

SQL Profiler zeigt, dass nichts eine UPDATE ähnelt dem db Motor nur dann gesendet wird, wird ein sehr, sehr lange WÄHLEN.

Dinge, die

Die „Key“ Einheit von einer anderen Einheit auswirken kann auf der Grundlage einer Bedingung erbt zu einer der Säulen aufgetragen.

Ich verwende den AutoFac-IOC-Container, um ViewModels zu liefern, die einen Datenzugriff mit einem Verweis auf eine Instanz meiner Datenzugriffsklasse durchführen möchten (im Beispiel "dataAccess").

Eine ObjectContext-Instanz ist ein Mitglied dieser Klasse (in Kommentaren als "this.entities" angezeigt).

Die dataAccess-Instanz ist Singletone Scoped, daher sollte nur eine Instanz unter den View-Modellen e.i geteilt werden. Sowohl "keyToMove" als auch "newSite" sind an denselben Kontext gebunden.

Sorry für die Länge dieses Beitrags, aber ich habe im Ernst keine Ahnung, was hier los ist und ich versuchte, so viele Details wie möglich zur Verfügung zu stellen. Bitte fragen Sie, ob weitere Informationen helfen würden.

Vielen Dank im Voraus.

+0

Debug durch die Eigenschaft Setter in yourModel.Designer.cs und sicher this.ReportPropertyChanged machen() aufgerufen wird. –

+0

Die Setter-Implementierung ähnelt nicht den anderen Navigationseigenschaften, siehe oben. – andrej351

+0

... ugh, schnell aus dem Haar, um hier herauszuziehen, bitte, wenn Sie eine Idee haben, was hier los sein könnte bitte posten – andrej351

Antwort

1

Ich bin gerade dabei, mir den Entitätsrahmen selbst beizubringen, damit ich den Punkt Ihrer Frage vermisse und sicherlich kein Experte bin. Allerdings kann es sein, dass Sie auf ein Problem stoßen, das ich selbst durcharbeiten musste.

Sie haben den Code, in dem Sie Ihre "newSite" -Variable erstellen, nicht veröffentlicht, aber beim Festlegen von Fremdschlüsseln in EF machen Sie das anders als in Linq oder Sie arbeiten nur in der Datenbank.Mit EF müssen Sie IN Ihren Fremdschlüsselwert auswählen, den Sie für Ihr Objekt festlegen möchten, und dann festlegen.

Das wird nicht funktionieren:

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

Stattdessen Sie etwas tun, wie folgt aus:

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

Ich hoffe, dass ich Ihre Frage verstanden!

Grüße, Mike

+0

Das ist wahr; Die EF aktualisiert nur die Eigenschaften, von denen sie glaubt, dass sie sich geändert haben. Wenn Sie keyToMove aus der DB materialisieren, ist das automatisch. Wenn Sie es selbst neu erstellen, müssen Sie den alten Standort festlegen, bevor Sie ihn dem Kontext zuordnen, damit die Änderung erkannt wird. –