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!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.
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.
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.
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:
-
Aby umożliwić wstrzyknięcie połączenia sql do TransformationProvider (lub dokładniej, sqlitetransformationprovider)
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.
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 doCREATE 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.
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