.Net下我们经常使用的System.Data.sqlite是一个嵌入了原生c++ sqlite数据库模块的程序集,由于大多数的Linux下默认已经具备了sqlite的运行环境,System.Data.sqlite无法运行在Linux下。所以,Mono.Data.sqlite [1]出现了,Mono.Data.sqlite可以让Mono下的程序使用相同的类名操作sqlite数据库,方便应用程序从Windows迁移到Linux:你只需更改项目引用即可。
但由于ActiceRecord已封装了NHibernate的数据库驱动类"NHibernate.Driver.sqlite20Driver",而该驱动类默认从System.Data.sqlite程序集中加载所需类,因此ActiceRecord使用sqlite在Linux环境下的Mono中运行就出现了矛盾:ActiveRecord需要System.Data.sqlite,而该程序集无法在Linux环境下的Mono中被正常运行,这就需要一个中间类[2]来进行转接,并且进行对应的配置。
namespace Your.Assembly{ public class MonosqliteDriver : NHibernate.Driver.ReflectionBasedDriver { public MonosqliteDriver() : base("Mono.Data.sqlite","Mono.Data.sqlite.sqliteConnection","Mono.Data.sqlite.sqliteCommand") { } public override bool UseNamedPrefixInParameter { get { return true; } } public override bool UseNamedPrefixInsql { get { return true; } } public override string NamedPrefix { get { return "@"; } } public override bool SupportsMultipleOpenReaders { get { return false; } } }}
<add key="connection.driver_class" value="NHibernate.Driver.sqlite20Driver" /><!--<add key="connection.driver_class" value="Your.Assembly.MonosqliteDriver,Your.Assembly" />-->
以Ubuntu 10.04为例,Mono.Data.sqlite.dll可以从该目录下找到
cp /usr/local/lib/mono/4.0/Mono.Data.sqlite.dll ~/