使用NHibernate和Mono.Data.SQLite

Nil*_*ils 5 sqlite nhibernate mono

我阅读并实现了尝试使用Nhibernate和Mono和SQLite - 找不到System.Data.SQLite 但是,作为最后的评论,这里说明这似乎不适用于NHibernate 3.1

错误是

HibernateException:找不到程序集Mono.Data.Sqlite中的IDbCommand和IDbConnection实现.确保程序集Mono.Data.Sqlite是[...可达...]

我在GAC中有Mono.Data.Sqlite.
我已经尝试指定"Mono.Data.Sqlite"以及typeof(Mono.Data.Sqlite.SqliteConnection).Assembly.FullName程序集的名称

有谁有任何想法如何让这个工作?

Nil*_*ils 7

尝试使用Nhibernate与Mono和SQLite的答案有一个问题- 找不到System.Data.SQLite.要使给定的构造函数(3个参数)起作用,需要首先加载有问题的程序集(Mono.Data.Sqlite).

如果使用4参数基本构造函数,则此方法有效:

public class MonoSQLiteDriver : NHibernate.Driver.ReflectionBasedDriver  
{  
        public MonoSQLiteDriver() 
            : base(
            "Mono.Data.Sqlite",
            "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;  
        }  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

(尽管如此,归功于http://intellect.dk/post/Why-I-love-frameworks-with-lots-of-extension-points.aspx的原创理念 - 谢谢.)

如果您使用FluentNHibernate,那么您还需要:

public class MonoSQLiteConfiguration : PersistenceConfiguration<MonoSQLiteConfiguration>
{
    public static MonoSQLiteConfiguration Standard
    {
        get { return new MonoSQLiteConfiguration(); }
    }

    public MonoSQLiteConfiguration()
    {
        Driver<MonoSQLiteDriver>();
        Dialect<SQLiteDialect>();
        Raw("query.substitutions", "true=1;false=0");
    }

    public MonoSQLiteConfiguration InMemory()
    {
        Raw("connection.release_mode", "on_close");
        return ConnectionString(c => c
            .Is("Data Source=:memory:;Version=3;New=True;"));

    }

    public MonoSQLiteConfiguration UsingFile(string fileName)
    {
        return ConnectionString(c => c
            .Is(string.Format("Data Source={0};Version=3;New=True;", fileName)));
    }

    public MonoSQLiteConfiguration UsingFileWithPassword(string fileName, string password)
    {
        return ConnectionString(c => c
            .Is(string.Format("Data Source={0};Version=3;New=True;Password={1};", fileName, password)));
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我没有遇到任何问题......