web-dev-qa-db-fra.com

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

Cette chose me rend fou, et l'erreur n'a aucune signification pour moi:

Impossible de mettre à jour EntitySet 'TableB' car il contient une DefiningQuery et aucun élément n'existe dans l'élément prenant en charge l'opération en cours.

Mes tables sont mises comme ceci:

 TableA 
 Int idA (identité, clé primaire) 
 ... 
 
 TableB 
 Int idA (FK pour TableA. idA) 
 int val 

TableB n'a pas de clé primaire définie sur le serveur SQL. Entity Framework a importé la table et l'association et a défini les deux champs comme clé. Mais cette erreur sera générée 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 est invalide)
  5. Supprimer la propriété store: Name

J'ai laissé la clé telle qu'elle était, puisqu'il était acceptable pour moi que les deux colonnes fassent partie de la clé.

123
Palantir

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 à 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 (aussi appelées procédures stockées) une pour Insérer, Mettre à jour et Supprimer.

Mais vous avez deux options:

Changer la définition de la clé:

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

Dans votre cas, je recommande (1).

141
Alex James

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

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

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, c'est qu'après avoir ajouté la clé à la table, je devais effacer la table d'edmx à l'aide du concepteur, enregistrer l'edmx, puis la mettre à jour pour rajouter la table. Ce n'était pas récupérer la clé. car il était déjà attribué en tant que vue. Cela n'a pas nécessité l'édition manuelle de l'edmx.

6
mlapaglia

Ajoutez la clé primaire à la table, supprimez le modèle du modèle edmx, puis sélectionnez update from database, build and run ...... works

5
user4584103

@Palantir. Vérifiez que les clés primaires sont définies dans vos deux tables et veillez à ce que plusieurs clés principales soient définies dans une table.

1