Entity Framework: Ignora colonne

Ho un database da cui desidero creare un modello EF, tuttavia non voglio includere determinate colonne dal database poiché le colonne interessate sono gestite esclusivamente sul server e non devono essere manipolate da alcuna applicazione.

Entrambe le colonne sono DateTime (se questo fa alcuna differenza), una delle colonne è annullabile e viene gestita da un trigger sugli aggiornamenti e l’altra non è annullabile e viene impostata utilizzando un valore predefinito nella definizione della tabella.

Immagino che sto cercando qualcosa come l’opzione “Server Generated” in Linq2Sql; ma non riesco a trovare una tale opzione.

Qualcuno può dirmi come aggirare questo?

Avvertimento:

Ho cercato di introdurre la modellazione di oggetti business sul mio posto di lavoro per alcuni anni ed è sempre stata rifiutata a causa della quantità di codice aggiuntivo che deve essere avviato a mano. L’EF è attualmente visto come una soluzione praticabile grazie alla progettazione e alla generazione del codice, quindi qualsiasi opzione che implichi il lancio manuale dell’XML non farà altro che allontanare il resto dei miei colleghi da EF. Sto quindi cercando qualcosa che possa essere fatto usando il designer o usando il codice.

MODIFICARE:

Immagino che quello che sto cercando sia qui …

(a) un modo per creare il modello senza EF facendo riferimento alle colonne nel negozio (ssdl) e quindi non cercando di manipolarlo in alcun modo (b) un modo per impostare in modo programmatico l’attributo “StoreGeneratedPattern” rispetto alla proprietà quando creo il ObjectContext (la risposta facile è quella di manipolarlo manualmente nel file .ssdl, ma questo verrà sovrascritto se aggiorno il modello dal database e non riesco a percorrere la rotta in cui i file .csdl, .msl e .ssdl sono fatti a mano ).

Puoi farlo con Entity Framework? Sì; è facile. Puoi farlo con il designer di Entity Framework? Sfortunatamente, questo è molto più difficile.

Il problema che stai avendo è che la colonna esiste nello schema di archiviazione (SSDL) nel tuo EDMX. La rimozione della colonna con la finestra di progettazione della GUI rimuove semplicemente dallo schema client, non dalla mapping o dallo schema di archiviazione. Tuttavia, è abbastanza semplice andare in EDMX e rimuoverlo. Fatto ciò, è ansible rimuoverlo anche dal mapping nelle parti dello schema client di EDMX, e il framework delle entity framework lamenterà più a lungo che non è mappato.

Problema risolto, giusto?

Beh no. Quando si utilizza la finestra di progettazione della GUI per aggiornare EDMX dal database, lo schema di archiviazione viene gettato e rigenerato. Quindi la tua colonna tornerà. Per quanto ne so, non c’è modo di dire al progettista della GUI di non mappare mai una particolare colonna. Quindi dovrai rifarlo ogni volta che aggiorni con il progettista della GUI. Fortunatamente, EDMX è XML, quindi puoi farlo con una trasformazione XML, LINQ o lo strumento XML di tua scelta.

Non puoi creare una vista con le colonne di cui hai bisogno e importarla attraverso la funzione guidata entity framework e mapparla alle tue quadro?

Non vuoi che la colonna appaia nel modello?

Prova a selezionare la colonna nella vista Designer e a premere il tasto Canc.

modificare

Potresti rendere privato il setter per la proprietà. Quindi la tua app non sarà in grado di modificare il valore.

Fare clic con il tasto destro sul campo nella rappresentazione grafica e selezionare Elimina. Ho riscontrato che a volte si verificano errori quando si apportano molte modifiche alla modellazione in una sola volta e si inizia a perdere traccia delle modifiche. La soluzione migliore potrebbe essere quella di ribuild il modello generato da EF.

Tieni presente che quando “aggiorni dal database”, i vecchi campi sui modelli generati non verranno rimossi, dovrai rimuoverli manualmente. Ad esempio, se hai rinominato DateField1 su DateField2 nel tuo database e quindi “Aggiorna modello dal database”, ora vedrai sia DateField1 che DateField2 sul modello risultante. Questo può essere una causa di errori.

La data / ora è un tipo di dati diverso da DateTime. Il timestamp sembra essere riconosciuto come un attributo che il motore gestisce, proprio come un attributo di identity framework. Non è ansible “aggiornare” un attributo timestamp. Quindi, l’EDM può gestirlo correttamente (proprio come fa un’id quadro).

È ansible modificare il modello di testo per ignorare queste colonne durante la generazione delle classi di quadro. Ad esempio se hai aggiunto “IGNORE” al riepilogo della documentazione, puoi modificare il modello per ignorarli sostituendo;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity) 

con;

 Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity).Where(Function(p) p.Documentation is nothing orelse p.Documentation.Summary.IndexOf("IGNORE")<0)