2011-09-23 8 views
5

Używamy mongodb z C#. Staramy się znaleźć sposób, aby nasza kolekcja była spójna. Teraz, jeśli deweloper wprowadza jakiekolwiek zmiany w strukturze klasy (dodaj pole lub zmień typ danych lub zmień właściwość w klasie zagnieżdżonej), musi ręcznie zmienić kolekcję mongo.Zarządzanie zmianami w strukturze klas, aby były spójne z kolekcją mongodb

Jego ból jak nasz projekt rozwija się i programiści pracujący nad projektem stale się powiększa. Czy zastanawiałeś się, czy ktoś już wymyślił sposób na zarządzanie tym problemem.

  • Badania
    1. I znaleziono similar question. jednak nie mógł znaleźć rozwiązania.
    2. Znaleziono sposób na znalezienie wszystkich właściwości Finding the properties; jednakże problemem staje się typ danych i zagnieżdżone dokumenty.
+0

Nie jestem pewien, rozumiem: Dokumenty w jednej kolekcji Mongo mogą być różne, więc nie ma nic Cię powstrzymuje od pchania nowe dokumenty do istniejącego zbioru, mimo że nowe dokumenty są na podstawie wystąpień zaktualizowanych klas. Czy jest to problem, który chcesz załatać istniejące dokumenty w db? Kolejna sprawa: czy problem dotyczy maszyny programującej, czy systemu produkcyjnego? –

+3

@ChristianHorsdal: Masz rację. nic nie powstrzymuje nas przed wstawianiem nowych dokumentów, jednak gdy pobieramy dokumenty, serializator wyrzuci wyjątek. dostępne jest obejście, jeśli zdecydujemy się zignorować dodatkowe elementy lub zebrać dodatkowe elementy w innym dokumencie BSON. Można to zrobić w serializatorze BSON. Ale szukaliśmy jakiegoś skryptu do wstępnej kompilacji, który powiadomi programistę o wprowadzeniu zmian. – Paul

Odpowiedz

1

Jeśli chcesz migrować stopniowo jako rekordy są dostępne trzeba przestrzegać kilku prostych zasad:

1) Jeśli dodać pole to lepiej być pustych lub mieć domyślną wartość określoną .

2) Nigdy nie zmieniaj nazw pól, nigdy nie zmieniaj typów pól
- Zamiast tego zawsze dodawaj nowe pola, dodaj kod migracji, usuń stare pola tylko po migracji wszystkich dokumentów.

Dla prototypów z MongoDB i C# zbudować dynamic wrapper ... który pozwala określić swoje obiekty za pomocą tylko interfejsów (bez klas potrzebne), a to pozwala dynamicznie dodawać nowe interfejsy do istniejącego obiektu. Nie jest gotowy do użytku produkcyjnego, ale do prototypowania oszczędza wiele wysiłku i sprawia, że ​​migracja jest naprawdę łatwa.

+0

Dzięki tej odpowiedzi odkryłem BsonDefaultValueAttribute, która jest niezbędna dla powyższego zalecenia! – kingdango

Powiązane problemy