Ha un DefiningQuery ma nessun elemento InsertFunction ... err


123

Questa cosa mi sta facendo impazzire e l'errore non ha senso per me:

Impossibile aggiornare EntitySet "TableB" perché ha DefiningQuery e non esiste alcun elemento nell'elemento per supportare l'operazione corrente.

Le mie tabelle sono messe in questo modo:

TableA
int idA (identità, chiave primaria)
...

TableB
int idA (FK per TableA.idA)
int val

TableB non ha una chiave primaria definita nel server SQL. Entity Framework ha importato la tabella e l'associazione e ha impostato entrambi i campi come chiave. Ma produrrà quell'errore quando provo a fare un inserimento nella tabella!

Cosa c'è che non va??


Modifica: come suggerito da Alex, la soluzione era questa:

  1. Fare clic con il tasto destro sul file edmx, selezionare Apri con, editor XML
  2. Individua l'entità nell'elemento edmx: StorageModels
  3. Rimuovere completamente DefiningQuery
  4. Rinomina il negozio: Schema = "dbo" in Schema = "dbo" (altrimenti, il codice genererà un errore che dice che il nome non è valido)
  5. Rimuovi la proprietà store: Name

Ho lasciato la chiave così com'era, poiché per me andava bene che entrambe le colonne facessero parte della chiave.


6
Grazie per l'aggiornamento: le istruzioni dettagliate hanno aiutato questo newb EF a far funzionare l'app tutorial ASP.NET MVC!
Adam Neal

Grazie per questo! Ho avuto un problema che EF non ha generato il file edmx corretto per la tabella SQL Server 2000 che HA la chiave primaria. Ma questa istruzione mi ha salvato :)
100r

4
3,5 anni dopo, e questo post sta ancora aiutando le persone, in questo caso, ME! ... A: Palantir per la descrizione passo passo (ha funzionato) e grazie ad Alex >>> Bravo!
nanonerd

La soluzione ha funzionato per me .. Grazie
Delavega

Il segreto era rimuovere "store:" dalla definizione dello schema. Molto bella
Guilherme Ferreira

Risposte:


141

Quando una tabella viene rilevata senza un PrimaryKey, viene trattata come una vista.

E le visualizzazioni vengono visualizzate nel file EDMX (aperto in un editor XML per vederlo) nell'elemento StorageModel \ EntitySet [n] \ DefiningQuery.

Quando si dispone di una DefiningQuery, l'entità diventa di sola lettura a meno che non si aggiungano funzioni di modifica. Sono necessarie 3 funzioni di modifica (note anche come Stored Procedures), una per ciascuna di Inserisci, Aggiorna ed Elimina.

Ma hai due opzioni:

Modifica la definizione della chiave:

  1. E convincere l'EF che ciò che pensa sia una vista è in realtà una tabella
  2. Oppure aggiungi le funzioni di modifica appropriate

Nel tuo caso ti consiglio (1).


Ho ricevuto questo errore quando stavo cercando di aggiungere un'entità a una tabella di giunzione. Il tuo suggerimento l'ha risolto, grazie!
Walter Stabosz

è eccellente ..., Tnks
Mohan Gundlapalli

Non dimenticare di fare clic su "Aggiorna modello dal database" sul tuo file .edmx che hai generato prima dal database
Bashar Abu Shamaa,

Sto affrontando lo stesso problema, la parte strana è che funziona bene nel nostro ambiente locale e di test, semplicemente non funziona nell'ambiente del cliente (noioso)
Mox Shah

13

Basta aggiungere una chiave primaria alla tabella. Questo è tutto. Problema risolto.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

6

Mi mancava una chiave primaria sul mio tavolo e ho ricevuto questo messaggio di errore. Una cosa che ho notato è che dopo aver aggiunto la chiave alla tabella, avevo bisogno di cancellare la tabella dall'edmx utilizzando il designer, salvare l'edmx, quindi aggiornarlo di nuovo per aggiungere nuovamente la tabella. Non stava raccogliendo la chiave poiché era già assegnata come vista. Ciò non richiedeva la modifica manuale di edmx.


5

Aggiungi la chiave primaria alla tabella, elimina il modello dal modello edmx, quindi seleziona Aggiorna dal database, crea ed esegui ...... funziona


1

@Palantir. Verifica che entrambe le tabelle abbiano chiavi primarie impostate e fai attenzione con più chiavi primarie impostate in una tabella.


0
  1. È necessario aprire manualmente il file .EDMX in Blocco note o Blocco note ++ o in qualsiasi editor di testo di propria scelta.
  2. Individua la voce in edmx: StorageModels nel file aperto al passaggio 1.
  3. Trova l'elemento DefiningQuery e rimuovi completamente questo tag.
  4. Trova il negozio: da Schema = "dbo" a Schema = "dbo" (se salti questo passaggio genererà un errore del nome non valido).
  5. Salva e chiudi il file.

Spero che risolva il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.