2009-06-05 9 views
0

I zwei Tabellen innerhalb einer MySql 5.1.34-Datenbank. Wenn SubSonic zum Generieren der DAL verwendet wird, wird die Fremdschlüsselbeziehung nicht skriptgesteuert, dh; Ich habe kein Parent.ChildCollection-Objekt. Ein Blick in die generierte DAL-Elternklasse zeigt Folgendes:SubSonic generiert keine MySql-Fremdschlüsseltabellen

//no foreign key tables defined (0) 

Ich habe SubSonic 2.1 und 2.2 und verschiedene MySql 5-Versionen ausprobiert. Ich muss verfahrenstechnisch etwas falsch machen - jede Hilfe wäre sehr willkommen. Dies hat bei MS-SQL immer nur "out-the-box" funktioniert.

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; 

Antwort

2

Es funktioniert für mich mit diesen Einstellungen.

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

Subsonic 2.2 und MySql 5.1.30. Sie sollten auch überprüfen, ob beide Tabellen MyISAM sind.

Und haben Sie gerade diesen Fremdschlüssel erstellt? Dann ist es wahrscheinlich, dass Subsonic Ihre Änderungen nicht bemerkt, weil MySQL das Tabelleschema zu cachen scheint. Siehe: http://code.google.com/p/subsonicproject/issues/detail?id=87

+0

Das wars - vielen Dank! Ich hätte die Config zu Tode gegoogelt aber war nicht gekommen über den generateRelatedTablesAsProperties Parameter Sehr nützlich, ta. –

+0

np, aber die generateRelatedTablesAsProperties = "true" sollte nicht das Problem an erster Stelle sein. Es wird im Grunde die öffentliche Methode "Product.GetOrders()" in eine öffentliche Eigenschaft " Produktbestellungen –

0

Ich bin kein Unterschall Experte, aber ich frage mich, ob es eine technische Verletzung einer Regel sein kann, in der Syntax, dass vielleicht Unterschall verwirrt: nach MySQL's reference,

Wenn die CONSTRAINT symbol Klausel ist gegeben, der Symbolwert muss in der Datenbank eindeutig sein.

Sie Namensgebung sowohl die CONSTRAINT und den KEY Index FK_Child - intuitiv, das macht Sinn und keinen Zweifel daran, MySQL und InnoDB mit ihm glücklich sind, aber vielleicht ist Unterschall diese Einschränkung anders und restriktiver Parsen. Was passiert, wenn Sie die Einschränkung umbenennen, um den technischen "Konflikt" der Namen zwischen ihr und dem Schlüsselindex zu vermeiden?

+0

Alex, vielen dank für Ihre rasche Antwort auf seine erstellen. Daran hatte ich nicht gedacht. Ich habe die Constraint- und Schlüssel- und 'ParentId'-Referenzen umbenannt, aber das Problem besteht immer noch. –

+0

Aw :-(. Naja, war einen Versuch wert ... Entschuldigung, ich weiß nicht, was ich noch vorschlagen soll! –

0
  1. Verwendung InnoDB-Tabellen
  2. Verwendung SubSonic. MySqlInnoDBDataProvider anstelle von SubSonic. MySqlDataProvider !! (Sonst Unterschall wird still Ihre FKs ignorieren)
  3. definieren Primärschlüssel für Tabellen (brauchen nicht eindeutig zu sein)
  4. sicher sein, dass Ihre Tabelle hat FKs definiert (mysql ignoriert leise FK Erstellung einer unkorrekten Setup Ihre db oder Tisch, was hauptsächlich auf Punkt 1.) verwenden: anzeigen Tabelle sicher

hoffte, das hilft ...