2010-01-19 12 views
20

Sto usando .net framework 3.5 SP1.Il numero di membri nel tipo concettuale non corrisponde al numero di membri sul tipo di lato dell'oggetto

Dopo l'aggiunta di una colonna ad una tabella in SQL Server (così come cambiare una colonna esistente da consentire null a non annullabile), non posso più correre il mio progetto senza ottenere questo errore:

The number of members in the conceptual type 'XBRLDimensionalModel.axis_t' does not match with the number of members on the object side type 'EOL.Xbrl.Persistence.Data.axis_t'. Make sure the number of members are the same.

I rinunciato a cercare di trovare e correggere il codice generato. Ora ho cancellato tutti i miei file relativi alle entità locali e li ho rigenerati ricominciando da zero e aggiungendo un nuovo elemento (modello di dati di entità ADO.NET). Ho ancora questo errore.

L'unico modo per eseguire il progetto ora è annullare tutte le mie modifiche in sospeso e utilizzare l'ultima versione dal controllo del codice sorgente e, naturalmente, modificare le due colonne del database modificate in null.

Da tutto quello che ho letto finora sembra che avrei dovuto semplicemente "aggiornare" il mio modello dal database. Ciò ha comportato questa eccezione (sopra). Ma ora sono totalmente confuso che anche con una completa rigenerazione del modello di entità e con le classi di supporto sto ancora ricevendo quell'errore.

Ho modificato la proprietà sul mio modello edmx: "Elaborazione artefatti metadati" su "Copia nella directory di output". I file Designer.cs, csdl, msl, ssdl sembrano tutti coerenti con le ultime modifiche ai DB.

L'eccezione viene lanciata la prima volta che si fa riferimento all'istanza entityModel. Quindi è prima di qualsiasi caricamento o salvataggio dei dati dalla tabella modificata.

qualche idea in cui sto sbagliando? Grazie, TG

risposta

6

Aprire il modello come XML. Rimuovi tutti i riferimenti a quel tipo dal CSDL. Salva e chiudi, quindi riapri nella GUI. Ora dovresti essere in grado di aggiornare il modello come al solito. Se ciò non funziona, fai la stessa cosa, ma rimuovi anche da MSL.

+0

Craig, mi dispiace, vuoi dire solo il file CSDL o il file edmx o entrambi? e un'altra stupida domanda: per "aggiornare il modello" faccio semplicemente clic destro sullo sfondo della GUI | Aggiorna modello dal database | (Aggiorna scheda) Fine. ? –

+0

E un altro: quando dici "tipo" intendi l'entità che corrisponde alla mia tabella (Axis_t)? –

+0

Il CSDL viene generato da EDMX. Si desidera modificare la sezione * di CSDL dell'EDMX. Sì, fai clic con il tasto destro. Sì, intendo il tipo. –

1

Questo sembra un po 'prolisso per un commento così sto aggiungendo questo come un'altra risposta:

In suggerimento risposta di Craig ho aperto il file edmx in un visualizzatore XML e rimosso tutti i riferimenti a Axis_t (comprese le associazioni dovute a chiavi esterne). Dall'intero file.

Ho quindi "aggiornato" il modello aprendo il file edmx come interfaccia della GUI, tasto destro del mouse | aggiornamento dal database | Aggiungi (scheda) che ora elenca solo la tabella Axis_t. Ho aggiunto la tabella che sembrava funzionare correttamente e includeva la mia nuova colonna e la colonna è stata mappata correttamente.

Ho quindi eseguito il progetto allo stesso risultato. Lo stesso errore di come pubblicato sopra.

Ora ho ritornato di nuovo a quello che era in controllo del codice sorgente così come cambiare le colonne del database (nuovo e modificato uno) come annullabile. Il progetto funziona bene. Non sono ancora riuscito a implementare la nuova colonna DB in EF. Si comporta come se ci fosse una versione memorizzata/compilata del modello che non viene aggiornata tramite il processo di "aggiornamento".

+0

"Aggiornamento dal database" sostituirà completamente la sezione SSDL dell'EDMX. Aggiorna anche il CSDL quando crede di poterlo fare senza cancellare le modifiche apportate. Ad esempio, se si dispone di una colonna completamente nuova, è necessario aggiungerla al CSDL. D'altra parte, se si modifica il tipo di colonna, potrebbe non aggiornare il CSDL. Se il mio suggerimento originale non funziona per te, è probabile che ci sia una parte del MSL o CSDL relativa a quell'entità che hai perso. –

+0

Deve essere qualcosa di stupido in questo modo. Ho appena eseguito un piccolo test separatamente con 2 tabelle (genitore/figlio), impostato un nuovo modello, quindi aggiunto una colonna alla tabella figlio. Ho quindi eseguito i passaggi suggeriti e ha funzionato bene. In questo momento l'unica differenza è che il vero progetto è nel controllo del codice sorgente, ma non posso immaginare che ciò possa influire su questo. Proverò (ancora) ancora ... –

1

Quando si modifica una chiave esterna da nullable a non nullable (o viceversa), assicurarsi di modificare la molteplicità di associazione da 0..1 a 1 (o viceversa). A volte il progettista manca questo in un aggiornamento dal database.

32

Questo errore può verificarsi anche se il file EDMX è stato modificato all'esterno di Visual Studio.Fare clic con il pulsante destro del mouse sul file EDMX e fare clic su "Esegui strumento personalizzato"

+2

Questa dovrebbe essere la risposta accettata. –

0

Questo è successo a me quando sto lavorando su due versioni della stessa applicazione (con differenze di modello) che vengono compilate nelle stesse cartelle.

Sembra che Visual Studio non "ripulisca" correttamente la cartella "obj" temp e alcuni frammenti del vecchio modello siano ancora lì.

Se ho semplicemente eliminato tutti i file dalla cartella "obj" e ricompilare questo errore va via.

Il modello in ogni versione è perfetto che mi stava facendo impazzire.

Non dicendo che questa è la risposta alla domanda dell'OP ma è sicuramente un altro motivo per questo errore.

Steve

0

Ho avuto lo stesso problema per ore. Ho trovato che nel mio file Designer.cs una delle proprietà della mia entità mancava dei suoi attributi. (Non so come sia successo?)

[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)] 
[DataMemberAttribute()] 
public global::System.Int32 ContractCapacity 

Ora il messaggio di errore ha senso, questo era il DataMember mancante. Una volta aggiunto l'attributo, FUNZIONA !!!

0
  • Fare clic destro sul file edmx e aperto con XML.
  • Trova i tipi di dati errati e modificali.
  • Salvare il file.

Questo ha funzionato per me.

0

Ecco uno scenario da incubo che ho appena sperimentato: ho un sito Web MVC2 e un servizio WCF che sono stati creati separatamente, ma condividono una configurazione. All'interno di entrambi i progetti, ho usato lo stesso Nome contenitore entità; quindi ho preso la stessa stringa di connessione per entrambi i progetti. Alla fine i metadati sono usciti dalla sincronizzazione tra i due e hanno causato questo errore. La soluzione ovvia consisteva nel non utilizzare lo stesso Nome contenitore entità nei due progetti; il passaggio a un nome diverso mi ha permesso di specificare stringhe di connessione univoche, e quindi metadati, per ciascun componente che evitava il problema.

Ora che l'ho capito, è ovvio, ma ho avuto un'ora o due di tensione!

1

Ero di fronte allo stesso problema, quando ho aggiunto una colonna a db e aggiunto la rispettiva proprietà all'entità (edmx). Stavo anche usando il controllo del codice sorgente per la mia soluzione. Come ho notato, durante il salvataggio delle modifiche su qualsiasi file, salva i prompt di azione con l'opzione di sovrascrittura. Così, ho sovrascritto anche il designer.cs e il file di configurazione e il problema è stato risolto.

saluti, Bhushan

Problemi correlati