2010-10-03 4 views
0

Est-ce que quelqu'un sait comment obtenir des transactions MySQL travaillant sous Mono?MySQL Connector/NET - support pour les transactions sous Mono

J'utilise MySQL Connector/NET (via Subsonic 3) et il fonctionne parfaitement sous Microsoft .NET. Récemment cependant j'ai essayé d'exécuter le même site sous Mono sur Ubuntu et cela fonctionne presque - sauf que je n'arrive pas à faire fonctionner les transactions.

lecture autour des sites Mono/MySQL, il ne sait pas exactement ce qui est et non pris en charge.

Le problème initial est un NotImplementedExcetion avec la pile d'appels comme celui-ci:

[System.NotImplementedException]: The requested feature is not implemented. 

at MySql.Data.MySqlClient.MySqlConnection.EnlistTransaction (System.Transactions.Transaction) <0x00181> 
at MySql.Data.MySqlClient.MySqlConnection.Open() <0x00381> 
at SubSonic.DataProviders.DbDataProvider.CreateConnection (string) <0x00059> 
at SubSonic.DataProviders.DbDataProvider.CreateConnection() <0x00015> 

Il y a quelques mentions de ce sur le site MySQL qui semblent pointer vers Mono ne supportant pas l'infrastructure nécessaire pour faire fonctionner les transactions. Il y a aussi un commentaire que les transactions fonctionnent bien lorsque vous utilisez CommittableTransaction plutôt que TransactionScope. J'ai donc essayé, mais j'ai eu la même exception.

Un autre commentaire sur le site MySQL a suggéré la reconstruction du fournisseur de données MySQL avec l'option de construction MONO. Ce que j'ai essayé et le site fonctionne maintenant, mais les transactions ne sont pas utilisées - elles ont été simplement désactivées. Vraiment?

je trouve difficile de croire que les transactions ne peuvent pas être faits pour travailler dans cet environnement, mais ne peut pas trouver un exemple de travail.

Mono 2.6.7, Connexion MySQL/NET 6.3.4, Subsonic 3, Ubuntu 10.10

Répondre

0

J'ai également eu ce problème avec mono v.2.10.9 et mysqlconnector v. 6.6.5 et 6.7.2-Beta et je ne pouvais pas trouver un solution pour ce problème, mais maintenant je l'ai compris.

D'abord, je pris les sources de mysqlconnector et les ajouter dans mon dossier de projet. Je pensais que ça marcherait si je compilais le connecteur directement en mono mais ce n'est pas le cas. J'étagé creux le code et je trouve qu'il ya les lignes suivantes de code à la ligne 530 dans le fichier Connection.cs du projet MySql.Data:

#if !MONO && !CF && !RT 
    Console.WriteLine("### Should not be here... ###"); 
    if (Transaction.Current != null && Settings.AutoEnlist) 
    EnlistTransaction(Transaction.Current); 
#endif 

Le par moi a été ajouté Console.WriteLine pour essayer si elle sera apparaissent également si je cours mon application avec mono et il est apparu. J'ai donc commenté ces lignes et après que tout fonctionnait en ce moment.

La vraie solution ne devrait toutefois pas être de commenter certaines lignes de code. Pour résoudre ce problème, vous devez définir le symbole 'MONO'. Si vous utilisez MonoDevelop, faites un clic droit sur le projet MySql.Data et sélectionnez la section du compilateur. Vous y trouverez une zone de texte avec l'étiquette 'define symbols' ou quelque chose de similaire. Ajoutez simplement le nouveau symbole 'MONO' dans cette zone de texte.