2013-03-21 27 views
5

Ho creato un DataBase in SQL e creato un EDMX in Visual Studio 2012. Ha creato automaticamente classi POCO (TT). Tutto sembra a posto.Classe POCO in EF non funziona come previsto

Ora cambio il nome della colonna di una tabella. Aggiorno l'EDMX. Aprendo EDMX in XML e tutto sembra a posto.

Domanda 1

Dopo mi sono imbattuto strumento personalizzato nel TT, vedo che una nuova proprietà ha ottenuto creato in aggiunta, ad esempio:

SQL table name : Student 

Column name : sName 

Nel mio POCO Classe

public int sName{ get; set; } 

è stato creato automaticamente.

Ora posso cambiare il nome della colonna in SQL per

Column name : studentName 

La mia classe POCO

public int sName{ get; set; } 

public int studentName{ get; set; } 

Si tratta di un bug o ho bisogno di fare qualcosa per risolvere questo problema?

Cosa devo fare per evitare questo?

Domanda 2

Inoltre, se cambio il tipo di dati di qualsiasi colonna SQL e aggiornare il modello dal DB nel mio progettista EDMX, il modello concettuale non è aggiornato. Come faccio a fare questo?

risposta

25

In primo luogo, per capire il problema, quello che dovete sapere è che il file EDMX è solo un file XML che contiene 3 diverse sezioni:

  • CSDL: schema concettuale Definition Language
  • SSDL: Store definizione dello schema lingua
  • MSL: specifica Mapping lingua

Il CSDL contiene le entità e le relazioni che compongono il vostro concettuale modello. SSDL descrive il tuo modello DB e MSL è la mappatura tra il 2.

Il processo "Aggiorna modello da DB" aggiornerà l'SSDL (modifica tutto ciò che è incoerente con lo schema DB corrente), modificherà solo il CSDL nel caso in cui hai aggiunto nuove cose al tuo schema DB.

Questo è un comportamento del tutto normale in quanto lo schema concettuale potrebbe/dovrebbe essere diverso dal schema DB (a meno che non si desidera che il modello di dominio per apparire esattamente come un modello di DB che ovviamente non suonano come OOP/DDD best practice).

Per quanto riguarda @Peru, la soluzione sarebbe eliminare l'entità interessata (non l'intero EDMX!) E quindi eseguire il processo "Aggiorna modello dal database".

Spero che questo aiuti!

Edit:

C'è uno strumento, non a titolo gratuito, che è un plug-in di Visual Studio che consente di applicare le modifiche apportate nel DB, sia sul CSDL e file SSDL: Huagati DBML/EDMX Tools. L'unica soluzione "gratuita" è l'eliminazione dell'entità (o del campo destro all'interno di questa entità) che deve essere aggiornata.

Ricordare che CSDL deve essere gestito dagli sviluppatori e deve apparire come un modello di oggetto anziché un modello di database. Immagina di avere un'ereditarietà di installazione tra le tue entità o che hai diviso 1 tabella DB in 2 entità EDMX, l'esecuzione di "Aggiorna modello da DB" non dovrebbe sovrascrivere tutto!

+1

L'eliminazione dell'entità è l'unica soluzione? – Peru

+0

C'è un plug-in VS esistente che fa il lavoro. Ho modificato la mia risposta. – MaxSC

+0

@ MaxS-Betliclic: ci fornisci un esempio quando dici 'csdl deve sembrare un modello di oggetto piuttosto che un modello di DB' –

4

Personalmente, vorrei aprire il file edmx come XML e trovare il nodo problema ed eliminarlo. Il file è abbastanza facile da capire - non aver paura di provarlo almeno.

0

Solo la modifica manuale ha funzionato per una vista nel mio progetto. (passando da smallint a decimal (18,2))

Aprire il file .EDMX in un editor di testo, trovare la sezione appropite e modificare manualmente il tipo di proprietà = "..." valore.