2009-06-05 5 views
0

I deux tables dans une base de données MySql 5.1.34. Lorsque vous utilisez SubSonic pour générer le DAL, la relation de clé étrangère n'est pas scriptée, c'est-à-dire; Je n'ai aucun objet Parent.ChildCollection. La recherche dans la classe DAL Parent générée montre ce qui suit:SubSonic ne génère pas de tables de clés étrangères MySql

//no foreign key tables defined (0) 

J'ai essayé les versions SubSonic 2.1 et 2.2, ainsi que diverses versions de MySql 5. Je dois faire quelque chose de mal sur le plan procédural - toute aide serait grandement appréciée. Cela a toujours fonctionné "out-the-box" en utilisant MS-SQL.

TABLE `parent` (
    `ParentId` INT(11) NOT NULL AUTO_INCREMENT, 
    `SomeData` VARCHAR(25) DEFAULT NULL, 
    PRIMARY KEY (`ParentId`) 
) ENGINE=INNODB DEFAULT CHARSET=latin1; 

TABLE `child` (
    `ChildId` INT(11) NOT NULL AUTO_INCREMENT, 
    `ParentId` INT(11) NOT NULL, 
    `SomeData` VARCHAR(25) DEFAULT NULL, 
    PRIMARY KEY (`ChildId`), 
    KEY `FK_child` (`ParentId`), 
    CONSTRAINT `FK_child` FOREIGN KEY (`ParentId`) REFERENCES `parent` (`ParentId`) 
) ENGINE=INNODB DEFAULT CHARSET=latin1; 

Répondre

2

Cela fonctionne pour moi avec ces paramètres.

<add name="ProviderName" 
     type="SubSonic.MySqlInnoDBDataProvider, SubSonic" 
     connectionStringName="ConnectionString" 
     generateLazyLoads="true" 
     generatedNamespace="My.NameSpace" 
     generateRelatedTablesAsProperties="true" 
     tableBaseClass="ActiveRecord" /> 

Subsonic 2.2 et MySql 5.1.30. Vous devez également vérifier si les deux tables sont MyISAM. Et avez-vous créé cette clé étrangère? Ensuite, il est probable que Subsonic ne remarque pas vos changements, car MySQL semble mettre en cache le Tableschema. Voir: http://code.google.com/p/subsonicproject/issues/detail?id=87

+0

C'est fait - merci beaucoup! Je l'ai googlé la config à mort, mais ne venait pas à travers le paramètre generateRelatedTablesAsProperties Très utile, ta –

+0

np, mais le generateRelatedTablesAsProperties = "true" ne devrait pas être le problème en premier lieu, il va fondamentalement transformer la méthode publique "Product.GetOrders()" en une propriété publique " Product.Orders " –

0

Je ne suis pas expert subsonique, mais je me demande s'il peut y avoir une violation technique d'une règle, dans votre syntaxe, qui confond peut-être subsonique: selon MySQL's reference,

Si le CONSTRAINT symbol Si une clause est donnée, la valeur du symbole doit être unique dans la base de données.

Vous nommer à la fois le CONSTRAINT et l'indice KEYFK_Child - intuitivement qui fait sens et sans doute MySQL et InnoDB sont heureux avec elle, mais peut-être l'analyse syntaxique de subsonique cette restriction différemment et de façon plus restrictive. Que se passe-t-il si vous renommez la contrainte pour éviter le "conflit" technique entre les noms et l'index des clés?

+0

Alex, merci beaucoup pour votre réponse rapide. Je n'avais pas pensé à ça. J'ai renommé la référence de contrainte et de clé et 'ParentId' mais malheureusement le problème persiste. –

+0

Aw :-(Eh bien, valait la peine d'essayer ... désolé, je ne sais pas quoi d'autre à suggérer! –

0
  1. utiliser les tables InnoDB
  2. utilisation de subsonique. MySqlInnoDBDataProvider au lieu de SubSonic. MySqlDataProvider !! (Sinon subsonique silencieusement ignorer vos FKs)
  3. définissent la clé primaire pour vos tables (ne doivent pas nécessairement être unique)
  4. assurez-vous que votre table a défini FKs (ne tient pas compte mysql en silence FK création si vous avez correctement la configuration votre base de données ou d'une table, principalement en raison du point 1.) utiliser: show create table pour être sûr

espérons que cette aide ...