2009-05-28 12 views
14

Używam transakcji do wstawienia wielu wierszy w wielu tabelach. W przypadku tych wierszy chciałbym dodać te wiersze w kolejności. Po wywołaniu SaveChanges wszystkie wiersze są wstawiane poza kolejnością.Struktura encji rzędowych zamówienia reklamowego

Gdy nie używamy transakcji i zapisujemy zmiany po każdym wprowadzeniu, zachowujemy kolejność, ale naprawdę potrzebuję transakcji dla wszystkich wpisów.

+1

Dlaczego kolejność wstawiania do bazy danych SQL ma znaczenie? –

+5

Kolejność wstawiania nie ma znaczenia, jednak kolejność klawiszy podstawowych. – Wouter

Odpowiedz

9

Wstawienia zleceń/aktualizacje i usunięcia są w Entity Framework zależne od wielu rzeczy w Entity Framework.

Na przykład, jeśli wstawisz nowy produkt do nowej kategorii, musimy dodać kategorię przed produktem.

Oznacza to, że jeśli masz duży zestaw zmian, istnieją lokalne ograniczenia zamawiania, które musimy najpierw zaspokoić, i rzeczywiście to właśnie robimy.

Kolejność czynności wykonywanych w kontekście może być niezgodna z tymi regułami. Na przykład, jeśli to zrobisz:

ctx.AddToProducts(
    new Product{ 
     Name = "Bovril", 
     Category = new Category {Name = "Food"} 
    } 
); 

efekt polega na tym, że produkt jest najpierw dodawany (do kontekstu), a następnie, gdy idziemy po wykresie, dodajemy również kategorię.

tj kolejności włożyć w kontekście brzmi:

Product 
Category 

ale z powodu ograniczeń integralności referencyjnych musimy ponownie kolejność jak to przed przystąpieniem do wstawienia do bazy danych:

Category 
Product 

Więc to rodzaj lokalnego zamawiania jest niezbywalny.

Jeśli jednak nie ma lokalnych zależności, można teoretycznie zachować porządek. Niestety obecnie nie śledzimy "kiedy" coś zostało dodane do kontekstu, a ze względu na wydajność nie śledzimy elementów w celu zachowania struktur takich jak listy. W rezultacie nie możemy obecnie zachować kolejności niepowiązanych wstawek.

Jednak debatowaliśmy nad tym niedawno, więc bardzo chciałbym się przekonać, jak ważne jest to dla ciebie?

Nadzieja to pomaga

Alex

Program Menedżer zespołu Entity Framework

+0

Dzięki za wyjaśnienie. Z pewnością zaoszczędziłoby mi to trochę czasu, gdyby było obsługiwane, ale myślę, że mógłbym również wygenerować własne własne klucze podstawowe, aby osiągnąć ten sam efekt. – Wouter

+0

Istnieje kilka innych odpowiedzi na poniższe pytanie. Usunąłem problem, zamawiając na sygnaturach czasowych lub nie zamiast klucza podstawowego. – Wouter

+3

Każda aktualizacja w tej sprawie? Mam situtation gdzie moje tabele mają ograniczenie na Alternate Key, więc nie ma widocznej relacji na modelu. (A.K. to userName, zamiast userId). Jak więc zmienić kolejność wstawień, od tej chwili, kiedy dodaję użytkownika, a następnie dodaję użytkownika do grupy, zmiany nie powiedzie się. – hazimdikenli

1

Jestem w procesie przekraczania ten most. Zastępuję NHibernate przez EF, a problem, na który się natknę, polega na tym, w jaki sposób listy są wstawiane do DB. Jeśli dodaję pozycje do listy takiej jak ta (w kodzie pseduo):

list.Add (testObject); list.Add (testObject1);

Obecnie nie ma gwarancji, że otrzymam tę samą kolejność po uruchomieniu "SaveChanges". Szkoda, ponieważ mój obiekt listy (tj. Lista połączona) zna kolejność, w której został utworzony. Obiekty, które są powiązane za pomocą referencji MUSZĄ być zapisane w DB w tej samej kolejności. Nie wiem, dlaczego wspomniałeś, że "debatujesz" o tym. =)

+0

Nie jestem pewien, czy zauważy on, kiedy odpowiesz tutaj, prawdopodobnie powinieneś również skomentować swoją odpowiedź – Wouter

Powiązane problemy