2009-07-02 3 views
5

Zauważyłem dziwne zachowanie w mojej usłudze importowania dzisiaj, gdy próbowałem zaimportować wiele rekordów danych.Funkcja InsertAllOnSubmit wstawia tylko pierwszy rekord danych

Kiedy zrobić to w ten sposób, wszystkie dane rekordy są importowane i wartość auto zwiększana jest prawidłowe (see screenshot):

public void Create(List<Property> properties) 
{ 
    foreach (Property prop in properties) { 
     dbc.Property.InsertOnSubmit(prop); 
     dbc.SubmitChanges(); 
    } 
} 

Kiedy próbuję go tak, tylko pierwszy rekord danych get to poprawne automatycznego zwiększana wartość (see screenshot):

foreach (Property prop in properties) { 
    dbc.Property.InsertOnSubmit(prop); 
} 
dbc.SubmitChanges(); 

samo tutaj:

dbc.Property.InsertAllOnSubmit(properties); 
dbc.SubmitChanges(); 

Czy ktoś ma pomysł, dlaczego tak jest? Wszystkie trzy warianty powinny importować wszystkie rekordy danych zgodnie z moim rozumieniem, ale brakujące wartości automatycznie zwiększane wskazują, że nie jest tak.

[EDIT] Dodano dwa zrzuty ekranu.

+0

Tak na marginesie, czy na pewno jest to dbc.Property, a nie dbc.Properties? LINQ do SQL zazwyczaj pluralizuje nazwy kolekcji ... – BFree

+0

Tak, to "Właściwość". Sam nazwałem stoły, nie były generowane automatycznie lub coś w tym stylu. Ponadto, jeśli byłby nazywany "Właściwościami", to pierwszy przykład również nie powinien działać, czy powinien? –

+0

Wygląda na to, że ludzie zgadzają się z tym problemem, ale nikt nie daje +1? Cóż, zacznę. To brzmi jak może to być błąd dla mnie. – MattH

Odpowiedz

6

miałem ten sam problem i okazało się, problem był z powodu nadrzędnych równymi na zmapowanej klasie. Metoda My Equals porównywała tylko podstawowe pole klucza, które było polem identyfikacyjnym. Oczywiście, gdy obiekty są nowe, wszystkie tożsamości są równe 0. Tak więc, gdy wywołano InsertAllOnSubmit, uważano, że wszystkie nowe obiekty są takie same iw zasadzie ignorowane są wszystkie oprócz pierwszego.

2

Nie całkiem pewny dlaczego 2nd zmienność nie działa, jednak nie powinien być ostatni:

dbc.Property.InsertallOnSubmit(properties); 
dbc.SubmitChanges(); 

Edit

Za drugim razem pętli:

foreach (Property prop in properties) 
{ 
    var newProp = new Property(); 
    newProp = prop; 
    dbc.Property.InsertOnSubmit(newProp); 
} 
dbc.SubmitChanges(); 

Dla ostatniego rozwiązania spróbuj:

dbc.Property.InsertAllOnSubmit(properties.ToList()); 
dbc.SubmitChanges(); 
+0

Tak, oczywiście. Kopiuj i wklej błąd na ostatnim przykładzie :) –

+0

Czy masz jakieś błędy? – James

+0

Brak błędów. Dodałem dwa zrzuty ekranu do mojego pierwotnego wpisu. Jak widać, za pomocą pierwszej metody wszystkie właściwości otrzymują identyfikatory (liczby w kwadratowych nawiasach []). Na drugim zrzucie ekranu tylko pierwsza właściwość otrzymuje identyfikator. Nie mam absolutnie pojęcia, co jest nie tak, ponieważ podany kod jest jedyną rzeczą, która różni się na obu zrzutach ekranu! –

1

Napotkałem ten problem kilka minut temu.

Mój problem polegał na tym, że lista wysłana do InsertAllOnSubmit<mappedClass>() była pełna obiektów, które pochodziły z pojedynczej instancji mappedClass. Modyfikowałem elementy w zależności od instancji modelu widoku, który chciałem dodać do bazy danych, a następnie ponownie dodałem instancję do listy.

Wydaje się być błędem dla początkujących, ale może to być coś, co należy sprawdzić, jeśli ktoś nadal ma ten problem!

0

Po prostu użyj tego jednego, idealnego rozwiązania.
Jako, Mamy nowy podmiot, taki jak "TestTable".
Inicjalizacja tej jednostki wewnątrz pętli for jak

TestTable objTable = new TestTable(); 

i dodać elementy podmiot, jak również w spisie obiektów Lista <TestTable> w pętli for.
I przenieś InsertAllOnSubmit() poza pętlę for, a teraz będzie działać.