Czy Fluent NHibernate i migratordotnet grają ładnie razem?

Kocham Fluent NHibernate za budowanie mojego DBs i do tej pory nie znalazłem ograniczenia, które zatrzymało mnie w moich utworach.

Jednak w moim obecnym projekcie spodziewam się wprowadzenia do produkcji bardzo wcześnie w cyklu życia produktu i dlatego spodziewam się wielu małych zmian w schemacie db w miarę postępu.

Chciałbym śledzić te zmiany DDL amd DML w "migracjach", używając narzędzia takiego jak migratordotnet . Ale moje pytanie brzmi: czy możliwe jest uzyskanie tych dwóch narzędzi (lub podobne narzędzia) współpracujące ze sobą?

W duchu DRY, Jak mogę czerpać zmiany mojego schematu z moich mapowań w Fluent Nhibernate? Czy to możliwe?

A może lepiej zostawić generowanie schematów narzędziu takim jak migratordotnet i pozostawić Fluent NHibernate tylko z możliwością mapowania? Hmm, to wygląda na lepsze rozdzielenie obaw na poziomie narzędzia.

Zdrówko!
Author: Marc Climent, 2009-06-02

4 answers

Gordon,

Miałem to samo pytanie w poprzednich projektach i zdecydowaliśmy się na użycie migratordotnet wyłącznie dla naszych migracji baz danych i po prostu pominięcie SchemaUpdate całkowicie.

Nadal będę używać SchemaUpdate do szybkich prototypów, ale gdy tylko zacznę projekt na poważnie, używam tylko migratordotnet.

Z ustawieniem migracji do uruchomienia w ramach naszych nocnych kompilacji migratordotnet działa bardzo dobrze, gdy mamy więcej niż jedną osobę pracującą nad projektem.

 7
Author: Andrew Hanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 20:07:14

Spotykam się również z tym samym problemem, w którym nie chcę utrzymywać migracji (używając migratordotnet) i plików mapowania niezależnie. Jedyną pomocną rzeczą, jaką znalazłem do tej pory jest NHibernate SchemaUpdate, ale to nie obsługuje usuwania kolumn lub tabel. W przypadku tego typu zmian nadal będziesz musiał ręcznie napisać migrację. W tej chwili skłaniam się ku wykorzystaniu migratordotnet wyłącznie do zmiany bazy danych zamiast mieszania SchemaUpdate generowania DDL i migracje. Nadal wydaje się to podatne na błędy, ponieważ można nieprawidłowo przekonwertować zmiany warstwy mapowania/domeny na migracje.

 2
Author: Shane Fulmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 15:13:20

Mam ten sam problem. Oto mój bieżący przepływ pracy, który pozwala uniknąć Schema Update:

  • zbuduj bazę danych od podstaw (jeśli zostaną wprowadzone jakieś zmiany)
  • Przechowuj wszystkie dane referencyjne w arkuszach kalkulacyjnych
  • przeładuj wszystkie dane za pomocą specjalnego wiersza poleceń 'dataloader'

Ten przepływ pracy jest dobry do rozwoju, ponieważ odbudowanie i wypełnianie bazy danych od podstaw za każdym razem rozwiązuje problem kontroli wersji bazy danych. Zapewnia również dobrą podstawę do testowania wokół DB i rzeczywiste dane, które wstawiasz.

Oczywiście to nie będzie działać w produkcji, gdy uruchomiona jest żywa baza danych, która nie może zostać porzucona i odbudowana. To właśnie robię:

  • Po zakończeniu cyklu dev, biorę klon produkcji bazy danych. Baza danych Prod jest tylko do odczytu na czas aktualizacji (ok dla mojej aplikacji...nie jestem pewien co do aplikacji krytycznych dla czasu)
  • Użyj SQL Compare, aby przenieść zmiany i dane z dev do prod baza danych
  • Naciśnij to, aby przetestować.
  • jeśli test zostanie pomyślnie zakończony, przejdź do produkcji.

Nie jest to idealne rozwiązanie i wykorzystuje komercyjny produkt do porównywania SQL. To działa dla mnie, ale chciałbym usłyszeć kilka lepszych pomysłów.

 1
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-21 17:03:49

Tak-głównie. Z powodzeniem używam używanego zarówno FNH, jak i migratordotnet dla grubego klienta pulpitu i działa całkiem dobrze. Musiałem zmodyfikować go do dwóch rzeczy:

  1. Aby umożliwić wstrzyknięcie połączenia sql do TransformationProvider (lub dokładniej, sqlitetransformationprovider)

  2. Wyrwać odniesienia do innych Non SQLite TransformationProviders jak kiedy próbowałem spakować go z moją aplikacją to rzucać różne Błędy o bycie nie można znaleźć Oracle, Postgres itp.

  3. Jest to specyficzne dla sqlite-hack go w celu lepszego parsowania SQLite tworzenia instrukcji table. Niestety nie jest w stanie obsłużyć instrukcji create table w postaci CREATE TABLE FOO(id INT, ..., primary key(id)) (w przeciwieństwie do CREATE TABLE FOO(id INT PRIMARY KEY, ...), którą obsługuje). Połącz to ze sposobem usuwania kolumn (Utwórz nową kolumnę bez tabeli, Przenieś dane, usuń Oryginał i zmień nazwę Nowej na oryginał), oznacza to, że możesz uzyskać dość paskudne zachowanie, takie jak usuwanie kolumn na tabela sprawia, że kolumna klucza podstawowego nie jest kolumną klucza podstawowego.

 0
Author: fostandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 12:34:32