it-swarm.com.de

Wie kann ich "Nicht übereinstimmende Entitäts- und / oder Felddefinition" reparieren, wenn "Drush-Entitätsaktualisierungen" fehlschlagen?

Ich entwickle eine Site in Drupal 8 in Acquia Dev Desktop 2 unter Windows 10. Nach dem Update auf 8.5.0-beta1 habe ich diesen Fehler auf meiner Statusseite bemerkt (obwohl er möglicherweise dort war) früher in 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

Es ist möglich, dass dieser Fehler vom Menüelement-Extras-Modul herrührt, das ich vor ein paar Monaten installiert hatte, aber seitdem gelöscht habe.

Nach populären Ratschlägen lief ich drush entity-updates. Das hat das Problem nicht geheilt. Die Ausgabe (manuell eingegeben) aus meinem CMD-Fenster ist unten:

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]

Basierend auf der 2. Antwort hier und diese Referenz habe ich ein benutzerdefiniertes Modul namens "Database Fix" mit dem folgenden Inhalt in der Datei database_fix.module Erstellt. Ich bin kein Programmierer, daher gibt es hier viele Vermutungen:

<?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);
    }
}

Ich habe das Modul aktiviert, Seiten aktualisiert und update.php Ausgeführt, aber es hat nicht funktioniert.

3
Nick Hope

Obwohl diese Frage ziemlich alt und für Drupal 8 nicht mehr relevant ist, da Drush keine Entitätsaktualisierungen mehr enthält, glaube ich, dass auf dieser Seite immer noch Personen mit ausstehenden Entitätsaktualisierungsnachrichten im Statusbericht landen würden Ich bin auf dasselbe Szenario gestoßen und wollte dieses Problem beheben.

Die Nachricht wird angezeigt, wenn sich die Definition der Entität in der Datenbank von der Definition der Entität in der Datei unterscheidet, da ein Feld in der Entität gelöscht oder hinzugefügt wird. Dies wird häufig vorkommen, wenn Sie das Modul entwickeln und sich die Entitätsdefinition weiterentwickelt.

Durch Deinstallieren und Installieren des Moduls wird das Problem behoben, da Sie die Entität erneut erstellen.

Ich bin auf dasselbe Problem gestoßen und dachte, ich sollte dem auf den Grund gehen, da es nicht möglich war, das Modul weiter zu deinstallieren und zu installieren.

Drush hatte Entitätsaktualisierungen als Funktion, mit der Entitätsdefinitionen im laufenden Betrieb aktualisiert werden konnten. Dies wurde jedoch aus Drupal Core in 8.7.0 entfernt ( nterstützung für Entity-Updates aus Core entfernt )

Die Problemumgehung besteht darin, das Modul Devel Entity Updates zu installieren und die dentup-Alternative auszuführen

Wenn Sie Composer verwenden

composer require --dev drupal/devel_entity_updates

drush en devel_entity_updates

drush dentup

Damit sollte dieses Problem behoben sein. Das Modul zur Aktualisierung von Entwicklungsentitäten darf nur in Entwicklungsumgebungen verwendet werden. In höheren Umgebungen wird erwartet, dass Sie Änderungen an Ihren Entitäten über hook_updates Weiterleiten.

2
anoopjohn