2012-08-13 4 views
7

In this question, ho scoperto che le modifiche enum non sono gestite dalle migrazioni di Entity Framework. In effetti, le modifiche all'enumerazione non portano nemmeno a un errore di modello modificato, quindi puoi cambiare enum a volontà senza controlli.Gestione modifiche enum in Entity Framework 5

Le modifiche di enum che risultano in diversi valori int, come le modifiche o le rimozioni degli ordini, possono rendere i dati del database effettivamente non validi, poiché il significato del numero intero memorizzato è errato.

Per consentire alle Migrazioni di funzionare, è necessario eseguire manualmente SQL personalizzato che modifichi i valori di enum modificati.

Il problema è che lo sviluppatore deve ricordarsi di eseguire questa operazione e, in caso di supervisione, può verificarsi un danneggiamento dei dati efficace.

Come può qualcuno mettere in atto controlli contro questo? È possibile, nel caso in cui un enum cambi, lanciare un errore di modifica del modello o qualcosa del genere?

+1

La stessa domanda vale per i nomi: se qualcuno dimentica di trattare lo speciale, la colonna precedente verrà eliminata e ne verrà creata una nuova. Le migrazioni automatiche non sono adatte per l'uso di produzione se il downtime è un problema. – usr

+0

Poiché per le nuove enumerazioni non è richiesto alcun cambio di modello, non viene generato alcun errore di modifica del modello. EF non ha modo di sapere che il valore enum '1' nel database è diverso da 'Car' che aveva quel valore ma da quando è stato rinominato 'truck', le enumerazioni sono generalmente considerate costanti e non devono essere modificate. – simbolo

+0

Bene c'è ContextKey - un nome di tipo completo e un modello - che è una specie di blob binario nella tabella __MigrationHistory. Quel blob dovrebbe contenere la definizione di Enum e rilevare questo tipo di modifiche. Apparentemente no. Questo sembra un cattivo design di EF. – Eiver

risposta

2

un problema simile con le enumerazioni esiste in .Net quando li si sposta fuori ad un progetto diverso per essere utilizzato come libreria:

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

Provalo - enumerazioni, in generale, sono sorprendentemente fragili. La risposta è di assegnare sempre un valore esplicito alla tua enumerazione, per prevenire entrambi i problemi. Questo ti permette di sfruttare ancora il loro valore principale (nomi chiari invece di numeri magici e un po 'di più per digitare sicurezza negli argomenti del metodo), ma ti impedisce di rompere tranquillamente tutto.

È possibile applicare questa politica con recensioni di codice o post-commit tramite una regex.