2012-01-05 2 views
8

ho questo pezzo di codice:Linq non può trovare inserita record prima SubmitChanges

LinqDataContext ctx; 

MyRecord R = new MyRecord(); 
R.Title = "test"; 
ctx.AllRecords.InsertOnSubmit(R); 

bool bExists = ctx.AllRecords.Any(r => r.Title == "test"); 

Nota: non ho chiamato SubmitChanges.

Perché bExists viene restituito come falso? Linq non dovrebbe essere in grado di vedere il record inserito?

risposta

1

credo che

bool bExists = ctx.AllRecords.Any(r => r.Title == "test"); 

è una query SQL che il server SQL restituisce il risultato. Quindi, se non avete presentato, allora il DB non sa nulla:

MyRecord R = new MyRecord(); 
R.Title = "test"; 
+0

Ok, ma il mio punto è che Lin2SQL dovrebbe raccoglierlo non dovrebbe? Non memorizza nella cache gli oggetti? C'è un metodo che posso chiamare che controlla anche la cache? – Jack

+0

L2S memorizza nella cache gli oggetti ma credo che i dati non inviati siano archiviati in una posizione diversa dai dati "reali". Non avrebbe senso archiviarli nella stessa posizione perché se si modifica una voce e quindi si richiama la voce originale, non si desidera che la voce (originale o modificata) venga ignorata. –

8

See Linq non può scrivere i valori in DB, se SubmitChanges() non chiamato.

E per la seconda domanda, Sì, gli oggetti cache di Linq prima dell'invio. Possiamo anche ottenere record che sono nella cache ma non inviati al database.

Come si è inserito record di cui sopra, possiamo ottenere sopra registrare dalla cache di DataContext come di seguito:

in primo luogo ottenere changeset da DataContext come:

System.Data.Linq.ChangeSet MySet = ctx.GetChangeSet(); 

Dopo che, estrarre il modulo di registrazione Changeset:

MyRecord b = (MyRecord)MySet.Inserts.Last(); 

Otterrai MyRecord con titolo come "test", che hai inserito.

Spero che questo aiuti.