2012-08-13 20 views
7

W this question odkryłem, że zmiany enum nie są obsługiwane przez migracje Entity Framework. W rzeczywistości zmiany wyliczeniowe nawet nie powodują zmiany w modelu, więc możesz dowolnie zmieniać wyliczenia bez kontroli.Obsługa zmian enum w Entity Framework 5

Zmiany enum, które powodują różne wartości int, takie jak zmiana lub usunięcie zlecenia, mogą skutecznie unieważnić dane bazy danych, ponieważ znaczenie zapisanej liczby całkowitej jest teraz nieprawidłowe.

Aby migracja działała, należy ręcznie wykonać niestandardowy SQL, który zmienia zmienione wartości wyliczenia.

Problem polega na tym, że deweloper musi o tym pamiętać, a jeśli doszło do przeoczenia, może dojść do skutecznego uszkodzenia danych.

Jak ktoś może wprowadzić kontrole przeciwko temu? Czy w przypadku zmiany wyliczenia można podać błąd zmiany modelu lub coś podobnego?

+1

To samo pytanie dotyczy nazw: Jeśli ktoś zapomni potraktować specjalnie, stara kolumna zostanie upuszczona i utworzona nowa. Migracje automatyczne nie nadają się do użytku produkcyjnego, jeśli problemem jest przestój. – usr

+0

Ponieważ nie jest wymagana zmiana modelu dla nowych wyliczeń, nie zostałby zgłoszony błąd zmiany modelu. EF nie może wiedzieć, że wartość wyliczeniowa "1" w bazie danych różni się od wartości "samochodu", która ma tę wartość, ale od tej nazwy zmieniona na "ciężarówkę", przeliczenia są zwykle uważane za stałe i nie należy ich zmieniać. – simbolo

+0

Cóż, istnieje ContextKey - w pełni kwalifikowana nazwa typu - i Model - który jest rodzajem binarnego bloba w tabeli __MigrationHistory. Ten obiekt typu blob powinien zawierać definicję Enum i wykrywać tego rodzaju zmiany. Najwyraźniej tak nie jest. Wygląda to na zły projekt EF. – Eiver

Odpowiedz

2

Podobny problem z teksty stałe występuje w .NET po przeniesieniu ich do innego projektu mają być wykorzystane jako biblioteka:

http://bytes.com/topic/c-sharp/answers/271483-q-why-casting-enum#post1086722

Spróbuj - teksty stałe w ogóle są zaskakująco kruche. Odpowiedź brzmi: zawsze przypisuj wyraźną wartość do swoich wyrażeń, aby uniknąć obu problemów. To pozwala ci nadal wykorzystać ich podstawową wartość (jasne nazwy zamiast magicznych liczb i trochę więcej, aby wpisać bezpieczeństwo w argumentach metody), ale uniemożliwia ci ciche łamanie wszystkiego.

Możesz egzekwować te zasady za pomocą recenzji kodu lub haków po zatwierdzeniu przez wyrażenie regularne.

Powiązane problemy