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

asp.net entity-framework

Question

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 pour prendre en charge l'opération en cours.

Mes tables sont mises comme ceci:

TableA
int idA (identity, primary key)
...

TableB
int idA (FK for 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 le 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, car c'était correct pour moi que les deux colonnes fassent partie de la clé.

Réponse acceptée

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).


Réponse populaire

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>)


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow