9

Mam tabelę, która ma unikalny indeks na tabeli z kolumną porządkową. Tak na przykład tabela będzie posiadać następujące kolumny:DbContext SaveChanges Zamówienie instrukcji wykonania

tableid, ID1, ID2, porządkowej

Unikalny indeks jest po drugiej kolumny ID1, ID2, porządkowej.

Problem polega na tym, że usuwając rekord z bazy danych, następnie odejmuję sekwencje porządkowe, aby były ponownie sekwencyjne. Moja funkcja kasowania będzie wyglądać następująco:

public void Delete(int id) 
    { 
     var tableObject = Context.TableObject.Find(id); 
     Context.TableObject.Remove(tableObject); 
     ResequenceOrdinalsAfterDelete(tableObject); 
    } 

Problem jest, że gdy zgłoszę Context.SaveChanges() przerywa unikatowy indeks, jak się wydaje na wykonanie sprawozdania w innej kolejności niż zostały one przekazywane. Na przykład dodaje się dzieje:

  1. Resequence liczb porządkowych
  2. usunąć rekord

zamiast:

  1. Usuń rekord
  2. Resequence liczb porządkowych

Czy to jest prawidłowe zachowanie EF? A jeśli tak, to czy istnieje sposób na nadpisanie tego zachowania, aby wymusić kolejność egzekucji?

Gdybym nie wyjaśniłem tego prawidłowo, proszę dać mi znać ...

Odpowiedz

9

Zamówienie poleceń jest całkowicie pod kontrolą EF. Jedynym sposobem, w jaki sposób można wpłynąć na kolejność używa oddzielnych SaveChanges dla każdej operacji:

public void Delete(int id) 
{ 
    var tableObject = Context.TableObject.Find(id); 
    Context.TableObject.Remove(tableObject); 
    Context.SaveChanges(); 
    ResequenceOrdinalsAfterDelete(tableObject); 
    Context.SaveChanges(); 
} 

Należy również uruchomić ten kod w utworzone ręcznie transakcji w celu zapewnienia niepodzielność (=>TransactionScope).

Jednak najlepszym rozwiązaniem byłoby prawdopodobnie użycie procedury przechowywanej, ponieważ resekwencja musi pobrać wszystkie zmienione rekordy z bazy danych do aplikacji, zmienić ich porządki i zapisać je z powrotem do bazy danych jeden po drugim.

Przy okazji. robiąc to z zapachem bazy danych. Jaki jest problem z luką w sekwencji "porządkowej"?

+0

Cześć dzięki za odpowiedź! Zaimplementowałem to wcześniej z bazą danych i jak już powiedziałeś, śmierdzi. Kod jest okropny i był uciążliwy, a to będzie dostępne tylko z sekcji administratora i zmieni niewielkie kwoty. Głównym powodem resekwencji porządkowych jest to, że administratorzy mogą ustawić kolejność na kilku stołach i stają się wybredni lub zagubieni, gdy zobaczą luki ... Trochę pomyłki, że EF nie wykonuje się w kolejności, którą podajesz. – didiHamman