mi sono imbattuto in un problema cercando di aggiornare un campo chiave esterna:Come aggiornare una chiave esterna in modo efficiente in LINQ a SQL/SQLMetal?
record.ForeignId = newId;
bombarda con "Operazione non è valida a causa dello stato corrente dell'oggetto" a causa di codice SQLMetal che getta System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException()
.
io non ero il primo a colpire il problema:
LinqToSQL Error : Operation is not valid due to the current state of the object e http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/ discuterne, tra gli altri.
La loro soluzione è questa:
record.Foreign = Database.Foreigns.Single(c => c.Id == newId);
Questo, naturalmente provoca una ricerca DB Foreign solo per ottenere un oggetto che ha di nuovo l'Es so già! Quindi, come posso realizzare questo aggiornamento senza la query inutile (o le query se ho molti di questi FK)?
Non sapevo di Attach(), ma l'ho provato e ho ricevuto un errore di chiave duplicato: "Impossibile aggiungere un'entità con una chiave già in uso." Ha interrogato il DB per scoprirlo, o forse quel disco era semplicemente sospeso nel mio contesto di dati ...? –
DataContext tiene traccia di tutti i record che ha caricato (per chiave primaria). Se ha caricato un genitore con Id = 5, non sarà possibile allegare un'altra istanza di Genitore con Id = 5. –
E c'è un modo per vedere se uno è memorizzato nella cache e pescarlo fuori se lo fa? E in caso contrario gin uno nuovo come nella tua risposta? O forse dirgli di abbandonare quello che ha prima? O qualcosa per far funzionare questo schema? –