web-dev-qa-db-fra.com

Comment réparer «Entité et / ou définition de champ non concordants» lorsque «drush entity-updates» échoue?

Je développe un site en Drupal 8 dans Acquia Dev Desktop 2 sur Windows 10. Après la mise à jour vers 8.5.0-beta1, j'ai remarqué cette erreur sur ma page d'état (bien qu'elle puisse y être plus tôt en 8.4.4):

ENTITY/FIELD DEFINITIONS
Mismatched entity and/or field definitions
The following changes were detected in the entity type and field definitions.
Custom menu link
The menu_link_content.field_most_common_name field needs to be updated.

Mismatched entity and/or field definitions

Il est possible que cette erreur provienne du module Extras des éléments de men , que j'avais installé il y a quelques mois, mais supprimé depuis.

Suite à des conseils populaires, j'ai couru drush entity-updates. Cela n'a pas résolu le problème. La sortie (tapée manuellement) de ma fenêtre CMD est ci-dessous:

menu_link_content entity type :
  The menu_link_content.field_most_common_name field needs to be updated.
Do you wish to run all pending updates? (y/n): y
Drupal\Core\Entity\EntityStorageException: Exception thrown while
performing a schema update. SQLSTATE[42522]: column not found: 1054 unknown
column   [error]
'field_most_common_name_argument' in 'where clause': SELECT 1 AS expression
FROM
{menu_link_content__field_most_common_name} t
WHERE (field_most_common_name_target_id IS NOT NULL) OR
(field_most_common_name_display_id IS NOT NULL) OR
(field_most_common_name_argument IS NOT NULL) OR
(field_most_common_name_title IS NOT NULL) OR
(field_most_common_name_data IS NOT NULL)
LIMIT 1 OFFSET 0; Array
(
)
 in Drupal\Core\Entity\Sql\SqlContentEntityStorage->wrapSchemaException()
(line 1535 of C:\Users\Nick\Sites\devdesktop\drupal\core\lib\Drupal
\Core\Entity\Sql\SqlContentEntityStorage.php).
Failed: Drupal\core\EntityStorageException: !message in
Drupal\Core\Entity\Sql\SqlContentEntityStorage->wrapSchemaException()
(line 1535 of
C:\Users\Nick\Sites\devdesktop\drupal\core\lib\Drupal\Core\Entity
\Sql\SqlContentEntityStorage.php).   [error]
Cache rebuild complete.   [ok]
Finished performing updates.   [ok]

Sur la base de la 2ème réponse ici et cette référence , j'ai créé un module personnalisé appelé "Database Fix" avec le contenu suivant dans le database_fix.module fichier. Je ne suis pas un codeur, donc il y a beaucoup de conjectures impliquées ici:

<?php

/**
 * Fix database by updating menu_link_content.field_most_common_name field
 *
 */
function database_fix_update_8501() {
    $manager = \Drupal::entityDefinitionUpdateManager();
    if ($field = $manager->getFieldStorageDefinition('field_most_common_name', 'menu_link_content')) {
      $manager->updateFieldStorageDefinition($field);
    }
}

J'ai activé le module, actualisé les pages et exécuté update.php, mais cela n'a pas fonctionné.

3
Nick Hope

Bien que cette question soit assez ancienne et ne soit plus pertinente pour Drupal 8 car drush n'a plus de mises à jour d'entités, je pense que les gens continueraient à atterrir sur cette page avec des messages de mises à jour d'entités en attente dans le rapport d'état . - Je suis tombé sur le même scénario et je voulais résoudre ce problème.

Le message s'affiche lorsque la définition de l'entité dans la base de données est différente de la définition de l'entité dans le fichier en raison de la suppression ou de l'ajout d'un champ dans l'entité. C'est quelque chose qui va se produire souvent lorsque vous développez le module et que la définition d'entité continue d'évoluer.

La désinstallation et l'installation du module résoudra le problème car vous recréez l'entité à nouveau.

J'ai rencontré ce même problème et j'ai pensé que je devrais aller au fond de cela car il n'était pas possible de continuer à désinstaller et à installer le module.

Drush avait auparavant des mises à jour d'entités comme fonctionnalité qui permettait de mettre à jour les définitions d'entités à la volée. Cependant, cela a été supprimé de Drupal core dans 8.7.0 ( Prise en charge des mises à jour d'entités supprimées du core )

Le travail consiste à installer le module Devel Entity Updates et à exécuter l'alternative dentup

Si vous utilisez le compositeur

composer require --dev drupal/devel_entity_updates

drush en devel_entity_updates

drush dentup

Cela devrait régler ce problème. Le module de mise à jour des entités de développement doit être utilisé uniquement dans les environnements de développement et dans les environnements supérieurs, vous êtes censé pousser les modifications de vos entités via hook_updates

2
anoopjohn