web-dev-qa-db-fra.com

MySQL - Entité: la valeur de la colonne 'IsPrimaryKey' dans la table 'TableDetails' est DBNull

J'utilise Visual Studio 2013 avec Entity Framework 5 et M ySQL Server 5.7.9 .

Lorsque vous essayez de créer un modèle à partir de la base de données (ou 'Mettre à jour le modèle à partir de la base de données'), le message suivant apparaît:

'System.Data.StrongTypingException: valeur de la colonne 'IsPrimaryKey' dans la table 'TableDetails' est DBNull. ---> System.InvalidCastException: la distribution spécifiée n'est pas valide.

Je sais que cette question a déjà été posée, mais je n'ai trouvé aucune solution ..__ De plus, je n'ai pas la possibilité de passer à MySQL 5.6.

Le problème se produit même pour une table simple.

La table échantillon

CREATE TABLE new_table
(
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(45) NOT NULL,
  PRIMARY KEY (id)
) 
ENGINE = InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Si la table est constituée uniquement de la clé primaire, le modèle est créé comme il se doit.

EDIT: Si je remplis les deux champs PRIMARY Keys, le modèle est créé sans erreur.

Est-ce que quelqu'un a une idée à ce sujet?

Sincères amitiés.

La pile d'erreur complète:

Impossible de générer le modèle en raison de l'exception suivante: 'System.Data.StrongTypingException: valeur de la colonne 'IsPrimaryKey' dans la table 'TableDetails' est DBNull. ---> System.InvalidCastException: la distribution spécifiée n'est pas valide. à Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.SchemaDiscovery.TableDetailsRow.get_IsPrimaryKey () --- Fin de trace de pile d'exception interne --- à Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.SchemaDiscovery.TableDetailsRow.get_IsPrimaryKey () à Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateProperties (IList1 columns, IList1 erreurs, List1& keyColumns, List1 & excludedColumns, List1& invalidKeyTypeColumns) at Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntityType(IList1. Colonnes, Boolean & needsDefiningQuery) à Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntitySets (IEnumerable1 tableDetailsRows, EntityRegister entityRegister, IList1 EntitySetsForReadOnlyEntityTypes, DbObjectTypeTypeType) à la valeur Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntitySets (IEnumerable1 tableDetailsRowsForTables, IEnumerable1 tableDetailsRowsForViews, EntityRegister entityRegister) à Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.Build (StoreSchemaDetails StoreSchemaDetails) à l'adresse Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelGenerator.CreateStoreModel () à Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelGenerator.GenerateModel (erreurs List1 errors) at Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine.GenerateModels(String storeModelNamespace, List1) à Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine.GenerateModel (EdmxHelper EdmxHelper) '. Le chargement de métadonnées à partir de la base de données a pris 00: 00: 00.5856317.

53
magarisi

Entity Framework (version 6.1.3) et serveur MySQL (> = 5.7.6)

Une façon de résoudre le problème est,

1. Open Services (services.msc) and restart MySQL57 service.
2. Execute the following commands in MySQL.
   use <<database name>>;
   set global optimizer_switch='derived_merge=OFF';
3. Update the .edmx.

C'est une réponse tardive. Mais espérons que cela aidera quelqu'un.

Merci.

166
Saravanan Sachi

Ceci est un bug connu: http://bugs.mysql.com/bug.php?id=79163

Exécutez la commande sur la console mysql:

set global optimizer_switch = 'dérivé_merge = désactivé'

OR

set @@ optimizer_switch = 'dérivé_merge = OFF " 

(celui-ci a fonctionné pour moi) 

Vérifiez que le changement est effectif avec cette commande:

SELECT @@ optimizer_switch\G

https://dev.mysql.com/doc/refman/5.7/fr/switchable-optimizations.html

23
martin

Toutes les réponses ci-dessus fonctionnent bien, mais lorsque le serveur ou la machine dev est redémarré, nous devons répéter toutes les étapes encore et encore . Pour résoudre complètement cette erreur, nous pouvons mettre l'attibut 'dérivé_merge = OFF' dans la configuration mysql __. Ok, pour ce faire, vous devez accéder à votre serveur MySQL avec MySQL Workbench et ouvrir "Fichier d'options"> onglet "Performances". Dans le groupe Optimizer, recherchez optimizer_switch, cochez la case pour activer un champ, puis inscrivez 'dérivé_merge = OFF' . Redémarrez votre serveur dans services.msc et voilá!

10
Kolodziey

Le sql suivant a fonctionné pour moi:

use adventureworks;
set global optimizer_switch='derived_merge=off';
set optimizer_switch='derived_merge=off';

select @@optimizer_switch;
select @@GLOBAL.optimizer_switch;

Ma version de MySQL est 5.7.15 et j'ai utilisé l'option "EF Designer From Database" de Visual Studio 2015.

J'espère que ça aide les autres :)

6
Recev Yildiz

La solution de contournement SET GLOBAL optimizer_switch = 'dérivé_merge = off';

5
caras

La valeur de la colonne 'IsPrimaryKey' dans la table 'TableDetails' est DBNull

C'est ce qui se produit lorsque vous essayez d'utiliser MySql avec Entity Framework.

J'ai résolu de cette façon:

Ouvrez le client de ligne de commande MySQL 5.7, entrez votre mot de passe, appuyez sur Entrée, puis tapez:

set global optimizer_switch='derived_merge=off';
set optimizer_switch='derived_merge=off';

select @@optimizer_switch;
select @@GLOBAL.optimizer_switch;

Redémarrez Visual Studio, c'est bon, j'ai essayé avec VS 2013 et VS 2017 et j'ai travaillé dans les deux!

3
FelipeFalanque

Exécutez ce script, cela fonctionnait parfaitement pour moi avec le paquet de nugget MySql.Data.Entity

use YourDB;
   set global optimizer_switch='derived_merge=OFF';
2
Frank Odoom

Nous avons rencontré la même erreur ... Mais je pense que c'est le problème du serveur MySQL.

statut:

  • EF5
  • MySQL VS Tools 1.2.5
  • Communauté VS 2015
  • C #
  • depuis Database create EF Designer (j'utilise l'édition japonaise, le nom du menu est mon anglais ...)

résultat:

  • MySQL 5.7.9 => erreur. 
  • MySQL 5.6.26 => pas d'erreur.
1
modeverv

Dans mon cas:

Modules utilisés:

Entity Framework 6 Connecteur de données MySQL 6.9.9 MySQL VS Tools 1.2.6 EF6 Tools pour VS2015

Je dois le faire => SET GLOBAL optimizer_switch = 'dérivé_merge = off'; Mais si vous vous connectez avec "root", l'erreur continue Lorsque vous vous connectez avec un utilisateur "commun", le modèle est créé, puis cliquez sur OK.

1
Maxi

À partir d'aujourd'hui, il s'agit d'un bogue vérifié MySql Community Server 5.7.9 avec ID 79163 .

En guise de solution de contournement, j'ai modifié l'application pour utiliser la pratique Code First

(Objet de données ADO.NET Entity -> Modèle vide de premier code}

et ajouté manuellement tous les objets et leurs propriétés.

Modules utilisés:

  • Entity Framework 6 
  • MySql Data Connector 6.8.9 
  • MySQL VS Tools 1.2.5
  • Outils EF6 pour VS2013
0
magarisi

j'ai trouvé une bonne solution de contournement pour ce type d'erreur. 

1. Solution (base de données d’abord) .__ Au lieu d’essayer de mettre à jour le modèle existant dans le fichier .edmx, cliquez avec le bouton droit de la souris sur l’une de vos entités dans edmx et choisissez -> accéder à modelbrowser (un nouveau registre apparaît dans l'explorateur de carte de projet) . Maintenant, choisissez l'entité que vous souhaitez mettre à jour, cliquez dessus avec le bouton droit et effectuez la mise à jour. Dans mon cas, cela fonctionnait à chaque fois sans qu'il soit nécessaire de désactiver quoi que ce soit dans mysql. Mais il peut arriver que vous soyez obligé de modifier certaines relations manuellement. Si quelque chose ne va pas ici (dans mon cas, il n'y a pas de problème avec la touche non fk/pk. Si vous supprimez un fk et essayez de commander vous-même toutes les relations, votre base de données risque d'être perdue. Mais cela ne se produit jamais si vous mettez à jour pas d'attributs de clé primaire/étrangère ou simplement d'ajouter une nouvelle table.

EDIT: Cette solution est idéale pour supprimer, mettre à jour et ajouter de nouvelles relations. Cela pose des problèmes lorsque les mises à jour sont effectuées sur les attributs fk/pk!

Si votre table a été supprimée, créez-en une nouvelle avec les mêmes préférences.

2. Solution (la base de données d’abord, lorsque les clés pk/fk doivent être mises à jour) Supprimer le tableau et en créer un nouveau. Cela prend 3 min tous ensemble

J'espère que je pourrais aider un peu, ce bug m'a rendu fou ces 2 dernières semaines!

p.s. Je n'ai jamais rencontré ce type de bogue jusqu'à ce que je l'ai écrasé! une clé étrangère dans une relation existante dans mysql. Ensuite, j'ai essayé de mettre à jour la relation avec le cadre de l'entité (la base de données d'abord) et depuis lors, le dbNullBug est apparu. J'ai pu gérer mes entités manuellement en ajoutant et en supprimant des attributs existants, mais c'était vraiment épuisant. La solution 1 fonctionne bien pour moi et si j'ai besoin de mettre à jour une clé étrangère, je supprime simplement le modèle existant et en crée un nouveau. 

0
I_zaski08