2012-01-05 11 views
8

mam ten kawałek kodu:LINQ nie może znaleźć rekord wstawiony przed SubmitChanges

LinqDataContext ctx; 

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

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

Uwaga: Nie nazwali SubmitChanges.

Dlaczego boksyści wracają jako fałszywe? Czy Linq nie powinien widzieć wstawionego rekordu?

Odpowiedz

1

wierzę, że

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

jest kwerenda SQL, że serwer SQL zwraca wynik. Więc jeśli nie złożyli, a następnie DB nie wiedzą nic na temat:

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

Okej, ale chodzi mi o to, że Lin2SQL powinien to wybrać, czyż nie? Czy nie buforuje obiektów? Czy istnieje metoda, którą mogę wywołać, która również sprawdza pamięć podręczną? – Jack

+0

L2S buforuje obiekty, ale uważam, że nieprzesłane dane są przechowywane w innym miejscu niż "prawdziwe" dane. Nie ma sensu przechowywanie ich w tym samym miejscu, ponieważ jeśli zmodyfikujesz wpis, a następnie zażądasz oryginalnego wpisu, nie chcesz, aby wpis (oryginalny lub zmodyfikowany) został zastąpiony. –

8

See LINQ nie można zapisać wartości w DB, jeśli SubmitChanges() nie nazywa.

I na drugie pytanie, Tak, obiekty linq cache przed przesłaniem. Możemy również uzyskać rekordy, które znajdują się w pamięci podręcznej, ale nie zostały przesłane do bazy danych.

Jak dodaje rekord powyżej, możemy uzyskać powyżej rekordu z pamięci podręcznej datacontext jak poniżej:

najpierw uzyskać changeset z DataContext jako:

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

Po niej wyodrębnić rekord formularz changeset:

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

Otrzymasz MyRecord z tytułem jako "test", który włożyłeś.

Mam nadzieję, że to pomoże.