Il a un DefiningQuery mais pas d'élément InsertFunction… err

123

Cette chose me rend fou, et l'erreur n'a aucun sens pour moi:

Impossible de mettre à jour le EntitySet 'TableB' car il a un DefiningQuery et aucun élément n'existe dans l'élément pour prendre en charge l'opération en cours.

Mes tableaux sont mis comme ceci:

TableauA
int idA (identité, clé primaire)
...

TableauB
int idA (FK pour TableA.idA)
int val

TableB n'a pas de clé primaire définie dans le serveur SQL. Entity Framework a importé la table et l'association et défini les deux champs comme clé. Mais cela produira cette erreur lorsque j'essaierai de faire une insertion dans la table!

Qu'est-ce qui ne va pas??


Edit: Comme suggéré par Alex, la solution était la suivante:

  1. Faites un clic droit sur le fichier edmx, sélectionnez Ouvrir avec, éditeur XML
  2. Localisez l'entité dans l'élément edmx: StorageModels
  3. Supprimer complètement la DefiningQuery
  4. Renommez le magasin: Schema = "dbo" en Schema = "dbo" (sinon, le code générera une erreur indiquant que le nom n'est pas valide)
  5. Supprimer le magasin: propriété Name

J'ai laissé la clé telle quelle, car il m'était normal que les deux colonnes fassent partie de la clé.

Palantir
la source
6
Merci pour la mise à jour - les instructions étape par étape ont aidé ce nouveau EF à faire fonctionner l'application de didacticiel ASP.NET MVC!
Adam Neal
Merci pour ça! J'ai eu un problème car EF n'a pas généré le fichier edmx approprié pour la table SQL Server 2000 qui a la clé primaire. Mais cette instruction m'a sauvé :)
100r
4
3,5 ans plus tard, et ce billet aide toujours ppl, dans ce cas, MOI! ... A: Palantir pour la description étape par étape (ça a marché) et merci à Alex >>> Bravo!
nanonerd
La solution a fonctionné pour moi. Merci
Delavega
Le secret supprimait "store:" de la définition de schéma. Very nice
Guilherme Ferreira

Réponses:

141

Eh bien, lorsqu'une table est rencontrée sans PrimaryKey, elle est traitée comme une vue.

Et les vues apparaissent dans le fichier EDMX (ouvert dans un éditeur XML pour voir) dans l'élément StorageModel \ EntitySet [n] \ DefiningQuery.

Lorsque vous avez une DefiningQuery, l'entité devient en lecture seule sauf si vous ajoutez des fonctions de modification. Vous avez besoin de 3 fonctions de modification (alias procédures stockées) une pour chacune des fonctions d'insertion, de mise à jour et de suppression.

Mais vous avez deux options:

Changez la définition de clé:

  1. Et convaincre l'EF que ce qu'il pense être une vue est vraiment un tableau
  2. Ou ajoutez les fonctions de modification appropriées

Dans votre cas, je recommande (1).

Alex James
la source
J'ai eu cette erreur lorsque j'essayais d'ajouter une entité à une table de jonction. Votre suggestion l'a corrigé, merci!
Walter Stabosz
it's Excellent ..., Tnks
Mohan Gundlapalli
N'oubliez pas de cliquer sur "Mettre à jour le modèle à partir de la base de données" sur votre fichier .edmx que vous avez d'abord généré à partir de la base de données
Bashar Abu Shamaa
Je suis confronté au même problème, la partie étrange est que cela fonctionne bien dans notre environnement local et de test, cela ne fonctionne tout simplement pas sur l'environnement du client (terne)
Mox Shah
13

Ajoutez simplement une clé primaire à la table. C'est tout. Problème résolu.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)
Jebastin J
la source
6

Il me manquait une clé primaire sur ma table et j'ai reçu ce message d'erreur. Une chose que j'ai notée est qu'après avoir ajouté la clé à la table, je devais effacer la table de l'edmx à l'aide du concepteur, enregistrer l'edmx, puis la mettre à jour à nouveau pour ajouter la table. Il ne prenait pas la clé car il était déjà assigné comme vue. Cela ne nécessitait pas de modifier manuellement l'edmx.

mlapaglia
la source
5

Ajouter la clé primaire à la table, supprimer le modèle du modèle edmx, puis sélectionner la mise à jour à partir de la base de données, construire et exécuter ...


la source
1

@Palantir. Vérifiez que vos deux tables ont des clés primaires définies et soyez prudent avec plusieurs clés primaires définies dans une table.

Paulo 'PaulusHC' Gomes
la source
0
  1. Vous devez ouvrir manuellement le fichier .EDMX dans notepad ou notepad ++ ou dans n'importe quel éditeur de texte de votre choix.
  2. Recherchez l'entrée dans edmx: StorageModels dans le fichier ouvert à l'étape 1.
  3. Recherchez l'élément DefiningQuery et supprimez entièrement cette balise.
  4. Trouvez le magasin: Schema = "dbo" à Schema = "dbo" (si vous sautez cette étape, cela générera une erreur du nom est invalide).
  5. Enregistrez et fermez le fichier.

J'espère que cela résoudra le problème.

Brijesh Kumar Tripathi
la source