È ansible creare tipi di dati definiti dall’utente quando si utilizza EF 4.1 Code First?

Quando si utilizza EF 4.1 Code First, è ansible creare tipi di dati definiti dall’utente per lo schema?

La risposta semplice è no.

Risposta più lunga:

L’implementazione attuale di EF porta a molteplici problemi quando si tenta di utilizzare i tipi definiti dall’utente:

  • Il tipo deve essere definito prima del suo utilizzo nella definizione DDL della tabella. Per questo motivo il tipo non può essere definito nel metodo Seed dell’inizializzatore del database (come spesso utilizzato per altri costrutti di database come trigger o indici). Per rendere questo lavoro è necessario creare un inizializzatore completamente nuovo mediante l’implementazione di IDatabaseInitializer e la creazione di database e creazione di tabelle separate, in quanto le definizioni dei tipi personalizzati devono essere tra di esse. Ecco alcuni esempi su come creare l’inizializzatore del database (questo ricreerà le tabelle ogni volta che si esegue l’applicazione).
  • La creazione di un inizializzatore del database che riflette le modifiche del modello dallo schizzo è più complicata perché questa logica è probabilmente interna a EF
  • È inoltre necessario aggiungere verificare che il tipo non sia già stato creato
  • Anche se hai l’inizializzatore, stai ancora affrontando il blocco più grande. EF non è pronto per consentire la definizione di tipi definiti dall’utente per le colonne: né ColumnAttribute e HasColumnType nell’API fluente accettano il tipo personalizzato. Quindi la tua mapping deve specificare i tipi base di SQL primitivi e questi tipi personalizzati saranno usati nelle tabelle DDL prodotte da EF. Quindi, a meno che il programma di inizializzazione del database personalizzato non post-processi quelli generati script SQL e sostituisce i tipi di base con i tipi personalizzati (soluzione davvero brutta) le tabelle non li utilizzerà.