2012-05-21 15 views
6

Co to jest najlepsze praktyki do uaktualniania bazy danych za pomocą ORM (DevExpress XPO, NHibernate lub MS Entity Framework)?DevExpress XPO vs NHibernate vs Entity Framework: Baza modernizacji kwestii

Zaczynam nowy projekt i muszę wybrać ORM. Proces rozwoju wymaga dość częstego wydawania pośrednich testów testowych i prawdopodobne jest, że każda kompilacja będzie zawierała zmiany w strukturze bazy danych. Każda nowa wersja musi zaktualizować DB delikatnie, aby zachować aktualne dane.

Dla starych rozwiązań chciałbym zapewnić zestaw skryptów SQL do uaktualniania bazy danych z v1 do v2 z v2 do v3 itp i wykonywać je kolejno.

Ale jak to będzie działać dla ORM? Czy nadal powinienem pisać skrypty SQL do aktualizacji DB?

Rozumiem, że proste dodanie nowych pól nie spowoduje problemu (zobacz np. UpdateSchema() method dla XPO), ale co, jeśli muszę podzielić tabelę i ponownie przydzielić bieżące rekordy do 2 nowych tabel?

Odpowiedz

6

nie mogę wypowiedzieć się na temat drugiej ORM, ale ja Użyłem DevExpress XPO do aplikacji skarbcowych od 2007 roku. Schemat zmienia się trochę w każdym wydaniu, ale w ciągu ostatnich lat nastąpiły również duże zmiany w schemacie. W nieco rozszerzonej wersji domyślnego mechanizmu aktualizacji XPO wygodnie pokrył wszystkie zmiany.

Istnieje dobra podstawowa informacja o aktualizowaniu aplikacji XPO pod numerem here.

  • DevExpress dostarcza narzędzie DBUpdater, które pomaga w aktualizacji środowiska produkcyjnego. Możesz rozszerzyć to narzędzie, aby zaspokoić dodatkowe wymagania. W mojej aplikacji dodaliśmy kilka opcji rejestrowania, podglądu z wycofywaniem, itp.

  • Każdy moduł ma wirtualne metody UpdateDatabaseBeforeSchemaUpdate() i UpdateDatabaseAfterSchemaUpdate(). Możesz znacząco kontrolować proces aktualizacji w obrębie tych.

Jak wspomina, niektóre uaktualnienia będą obsługiwane automatycznie przez XPO (na przykład, dodając nową kolumnę), ale niektóre rzeczy potrzebują dodatkowego sterowania, takich jak inicjowanie nową kolumnę o wartości domyślnej dla dotychczasowych rekordów.

Na przykład, załóżmy, że MyNewField została dodana do klasy XPO MyEntity w wersji 2.0 aplikacji. Powiedzmy, że domyślnie powinna mieć wartość 3 dla istniejących rekordów. XPO zajmie się tworzeniem nowej kolumny, ale istniejące rekordy będą mieć wartość NULL. (Jeśli określisz wartość domyślną w klasie XPO, będzie ona dotyczyć wyłącznie nowych rekordów). W celu skorygowania wartości dla istniejących zapisów chcesz dodać coś takiego do pliku jednostka modułu przesłonięte UpdateDatabaseAfterSchemaUpdate(): (. Można również użyć ObjectSpace.GetObjects<MyEntity>() i foreach jeśli wolisz, aby uniknąć bezpośredniego SQL)

public override void UpdateDatabaseAfterUpdateSchema() 
{ 
    base.UpdateDatabaseAfterUpdateSchema(); 
    if (CurrentDBVersion < new Version(2, 0, 0, 0)) 
     ObjectSpace.GetSession().ExecuteNonQuery(
      "UPDATE [MyEntity] SET [MyNewField] = 3 WHERE [MyNewField] IS NULL"); 
} 

W bardziej ekstremalnym przykładzie dzielenia tabeli na dwie części, możesz użyć tej samej metody, ale zamiast tego zastąpisz UpdateDatabaseBeforeUpdateSchema(), uruchom SQL, aby podzielić tabelę, pozwól XPO wykonać inne aktualizacje schematu i, jeśli to konieczne, zapełnij dowolne domyślne wartości w UpdateDatabaseAfterUpdateSchema().

Przekonasz się, że możesz natrafić na problemy z ograniczeniami, np. Naruszenia klucza obcego, więc możesz znaleźć kilka ogólnych procedur, takich jak DropAllForeignKeyConstraints() jako część UpdateDatabaseBeforeUpdateSchema(). Czasami okazuje się, że XPO już coś zapewnia, czasem nie. Brakujące wiązania i indeksy zostaną zregenerowane w aktualizacji schematu. (W moim doświadczeniu przełączanie klucza podstawowego tabeli danych głównych okazało się najtrudniejszą procedurą aktualizacji, aby uzyskać prawo).

Domyślnie połączenia odbywają się w transakcji SQL, więc jeśli coś zawiedzie, wszystkie powinny zostać wycofane.

Twórcy muszą mieć świadomość, kiedy zmiana modelu domeny może spowodować problem z podstawowym schematem.

Do testowania przechowujemy kilka starych baz danych klientów i przeprowadzamy szereg testów przed i po wykonaniu w ramach procesu budowania, aby upewnić się, że obecni klienci są w stanie odpowiednio zaktualizować wersję, z której dokonują aktualizacji. W produkcji, gdy mamy problem z aktualizacją, dane o problemie są dodawane do tej biblioteki testów, aby zapobiec podobnym problemom w przyszłości.

Mamy do czynienia z dużymi międzynarodowymi firmami i bankami. Klienci są zadowoleni z wyniku. W sytuacjach, w których korporacyjne DBA musi podpisać się na temat zmian, nie wydaje się, że mają do dyspozycji narzędzie wiersza poleceń do wykonania aktualizacji, a nie skrypt.

+2

To, co opisałeś, odnosi się do XAF, a nie do XPO. – Yuyo

0

Większość rozwiązań migracji może obsługiwać proste zadania, takie jak dodawanie nowej kolumny, relacje lub usuwanie, ale nie działa przy zmianie nazwy kolumny (czy to jest to add? Czy też usunięcie po dodaniu, które jest równe zmianie nazwy? robisz z danymi w takim przypadku?)

Wszystkie trzy rozwiązania mają wsparcie migracji podstawowych, XPO pozwala nawet uruchamiać własne skrypty jako część procesu (wstawić dane statyczne/testowe/stałe itp.)

Istnieje również projekt MigratorDotNet, którego można używać i nie można polegać na żadnej konkretnej funkcji ORM dotyczącej migracji.

Osobiście użyłbym automatycznej migracji tylko w środowisku programisty/testowym i miałbym pełny zestaw skryptów uaktualniających podczas pracy na konkretnej bazie danych klienta, aby poinformować o aktualizacji z wersji 1 do 2.

+0

Dzięki za szybką odpowiedź. Używam [Apex SQL Tools] (http://www.apexsql.com) do generowania skryptu SQL do aktualizacji. Obawiam się jednak, że skrypty SQL do aktualizacji zabijają niezależność ORM od typu bazy danych. –

+0

Jednak zapamiętanie ORM jest po to, aby rozwiązać inny problem, czyli odczyt z/do bazy danych. Aktualizacja schematu jest kolejnym problemem, z którym najlepiej poradzić sobie przy pomocy innego narzędzia, np. Migrator.NET lub narzędzi zewnętrznych, takich jak Apex SQL Tools. –

0

Jak to będzie działać w przypadku ORM? Czy nadal powinienem pisać skrypty SQL do uaktualnić DB?

Wyczyść odpowiedź na to pytanie należy na Stack Exchange Network wątku programisty - What are the criteria for evaluating an ORM for.NET?, nie mam prostej odpowiedzi na pytanie, który prosił, a mecze z mojego doświadczenia z ORM rozwijając jakiś projekt z Entity Framework i szablony Code Smith ORM .

W jaki sposób ORM zarządza zmianami w modelu danych? co, jeśli muszę podzielić tabelę i ponownie przydzielić bieżące rekordy na 2 nowe tabele?

Niektóre mogą zaktualizować DB automatycznie w pewnej mierze, inne nie robić nic i musisz zrobić brudną samodzielnej pracy; inne zapewniają strukturę obsługi zmian, która pozwala kontrolować aktualizacje bazy danych .That means every couple of days ktoś musi spędzić godzinę aktualizację modelu, aby dodać tabelę lub zmienić typy danych, które zmieniają

Ref:
https://softwareengineering.stackexchange.com/questions/6543/what-are-the-benefits-of-using-database-abstraction-by-orm
https://softwareengineering.stackexchange.com/questions/41739/best-arguments-for-against-introducing-orm-technology-into-a-companies-dev-proce/41833#41833

0

Jeśli zapytasz - jaka jest najlepsza praktyka ulepszania bazy danych przy użyciu ORM - moja odpowiedź brzmi: nie używaj jej, jeśli twoja aplikacja jest czymś więcej niż aplikacją dla hobbystów.

Istnieje wiele scenariuszy, w których wiele ORMów nie jest w stanie zapewnić wsparcia dla konkretnych potrzeb bazy danych, np. w tworzeniu procedur składowanych, tworzenia indeksów i widoków, a nawet indeksowanych widoków/zmaterializowanych tabel bez pisania skryptów sql. Problemy takie jak dodanie nowej nie-nullable do istniejącej tabeli są znacznie trudniejsze do rozwiązania w ORM-Migration-Code niż poprzez pisanie skryptów SQL.

Bieżące narzędzia takie jak Visual Studio Data Tools radzą sobie lepiej z tego typu problemami.

Powiązane problemy