Ich lief in ein Problem versucht, ein Fremdschlüsselfeld zu aktualisieren:Wie aktualisiere ich einen Fremdschlüssel effizient in LINQ to SQL/SQLMetal?
record.ForeignId = newId;
Es Bomben mit „Operation aufgrund des aktuellen Status des Objekts nicht gültig ist“ aufgrund SQLMetal Code, System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException()
wirft.
war ich nicht die erste Ausgabe treffen:
LinqToSQL Error : Operation is not valid due to the current state of the object und http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/ es diskutieren, unter anderem. diese
ist Ihre Lösung:
record.Foreign = Database.Foreigns.Single(c => c.Id == newId);
Das ist natürlich eine DB-Lookup für auswärtige verursacht nur ein Objekt zurück zu bekommen, die die Id habe ich schon kennen! Also, wie führe ich dieses Update ohne die sinnlose Abfrage (oder fragt, ob ich viele dieser FKs habe)?
Ich wusste nicht über Attach(), aber ich habe das versucht und einen doppelten Schlüsselfehler erhalten: "Kann keine Entität mit einem Schlüssel hinzufügen, der bereits verwendet wird." Hat es die DB befragt, um das herauszufinden, oder war diese Aufzeichnung vielleicht nur in meinem Datenkontext hängen ...? –
DataContext verfolgt alle Datensätze, die es geladen hat (nach Primärschlüssel). Wenn ein Parent mit ID = 5 geladen wurde, können Sie keine weitere Instanz von Parent mit Id = 5 anhängen. –
Und gibt es eine Möglichkeit zu sehen, ob man im Cache ist und es aussortiert, wenn es das tut? Und sonst gin up ein neues wie in deiner Antwort? Oder vielleicht sag ihm, dass er den ersten fallen lassen sollte? Oder irgendetwas, um dieses Schema funktionieren zu lassen? –