2012-12-02 2 views
8

Qualcuno può spiegare il seguente schema dei messaggi di errore di convalida dottrina per favore:Database FAIL - Lo schema del database non è in sincronia con il file di mapping corrente

The error message returned by the schema validate function

Ecco la definizione della yaml ORM di ogni entità in la relazione manyToMany, creata in linea con la sezione 5.9 di documentation.

Rep\Bundle\ProjectBundle\Entity\User: 
    type: entity 
    table: User 
    fields: 
     id: 
      id: true 
      type: integer 
      unsigned: true 
      nullable: false 
      generator: 
       strategy: AUTO 
     username: 
      type: string 
      length: 25 
      fixed: false 
      nullable: false 
     salt: 
      type: string 
      length: 32 
      fixed: false 
      nullable: false 
     password: 
      type: string 
      length: 40 
      fixed: false 
      nullable: false 
     email: 
      type: string 
      length: 60 
      fixed: false 
      nullable: false 
    manyToMany: 
     roles: 
      targetEntity: UserRole 
      inversedBy: users 
      joinTable: 
       name: UserRoleLookup 
       joinColumns: 
        user_id: 
         referencedColumnName: id 
       inverseJoinColumns: 
        user_role_id: 
         referencedColumnName: id 
    lifecycleCallbacks: { } 

E la configurazione inversa yaml UserRole:

Rep\Bundle\ProjectBundle\Entity\UserRole: 
    type: entity 
    table: UserRole 
    fields: 
     id: 
      id: true 
      type: integer 
      unsigned: true 
      nullable: false 
      generator: 
       strategy: AUTO 
     name: 
      type: string 
      length: 50 
      fixed: false 
      nullable: false 
    manyToMany: 
     users: 
      targetEntity: User 
      mappedBy: roles 
    lifecycleCallbacks: { } 

Ecco lo schema della tabella degli utenti:

CREATE TABLE `User` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `username` varchar(25) COLLATE utf8_unicode_ci NOT NULL, 
    `salt` varchar(32) COLLATE utf8_unicode_ci NOT NULL, 
    `password` varchar(40) COLLATE utf8_unicode_ci NOT NULL, 
    `email` varchar(60) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

Lo schema della tabella UserRole:

CREATE TABLE `UserRole` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

E l'UserRoleLookup schema:

CREATE TABLE `UserRoleLookup` (
    `user_id` int(11) unsigned NOT NULL, 
    `user_role_id` int(11) unsigned NOT NULL, 
    PRIMARY KEY (`user_id`,`user_role_id`), 
    KEY `user_role_id` (`user_role_id`), 
    CONSTRAINT `userrolelookup_ibfk_2` FOREIGN KEY (`user_role_id`) REFERENCES `userrole` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `userrolelookup_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Come si può vedere, si tratta di una configurazione abbastanza semplicistico con un look-up table di dettare i ruoli di un utente o l'insieme di utenti in un determinato ruolo utente. Tuttavia, sto ricevendo questo errore di sincronizzazione frustrante. Non ho letto nulla qui o online che risponda a questa domanda in qualche dettaglio conciso, speravo che qualcuno potesse chiarire se sono sicuro di lasciare questa configurazione e ignorare questo errore?

risposta

17

In esecuzione php bin/console doctrine:schema:update --dump-sql wil mostra le differenze nell'SQL senza dover scaricare il db.

è anche possibile eseguire il seguente comando per eseguire le modifiche:

php bin/console doctrine:schema:update --force --full-database

Per Symfony2 era

php app/console doctrine:schema:update --force --full-database

+3

. Ha funzionato per me. Ovviamente il comando è "orm: schema: update" nel caso in cui si usi zf2 e doctrine/doctrine-orm-module –

+1

Questo dà l'errore "L'opzione '--full-database' non esiste." (Symfony 2.8.1) –

+0

Sembra che sia stato rinominato come '-completo': https://github.com/doctrine/doctrine2/blob/b055d78ea19835fab563dfc234d4804a9d04966a/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand. php –

5

È semplice: alcuni campi o relazioni, entità, ecc. Non sono ancora stati tradotti come colonna o tabella nello schema del database. Aggiorna il tuo schema e starai bene.

+0

ho buttato la corrente tabelle e li ha rigenerati utilizzando il comando docfine della console symfony2 e passata la fase di convalida. Gli schemi a malapena divergevano se non che i campi ID non firmati diventavano firmati, il che è stupido, ma almeno il mio errore va via. –

+0

Non è completamente vero, a volte ad esempio quando si mescolano attributi errati con annotazioni si può avere questo errore. – COil

+0

@COil in questo caso, la linea con '[Mapping]' è rossa, giusto? Non la riga con '[Database]' – greg0ire

2

Per chiunque sia interessato a questo, ri-generare il mio schema della tabella ha prodotto i seguenti look-up schema:

CREATE TABLE `UserRoleLookup` (
    `user_id` int(11) NOT NULL, 
    `user_role_id` int(11) NOT NULL, 
    PRIMARY KEY (`user_id`,`user_role_id`), 
    KEY `IDX_4511E771A76ED395` (`user_id`), 
    KEY `IDX_4511E7718E0E3CA6` (`user_role_id`), 
    CONSTRAINT `FK_4511E7718E0E3CA6` FOREIGN KEY (`user_role_id`) REFERENCES `UserRole` (`id`), 
    CONSTRAINT `FK_4511E771A76ED395` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\ 

immagino fasci Symfony2-dottrina non sono un grande fan di numeri interi senza segno, come posso vedo pochi cambiamenti dallo schema che ho postato. Ad ogni modo, il problema è risolto.

+0

dovrai aggiungere manualmente numeri interi senza segno ... e sì, peccato se hai molte entità, spero che pensino al resto di noi usando la buona idea senza firma int –

3

per Symfony3:

app/console cambiato in bin/console, --full-database---complete

in modo che il comando finale sarà:

php bin/console doctrine:schema:update --force --complete --dump-sql 
0

php bin/console dottrina: schema: update --dump-SQL può essere opere è fissato il mio problema

+0

Si prega di vedere questo primo [come risposta] (https://stackoverflow.com/help/how-to-answer) –