【问题标题】:Trying to using Nhibernate with Mono & SQLite - can't find System.Data.SQLite尝试将 Nhibernate 与 Mono 和 SQLite 一起使用 - 找不到 System.Data.SQLite
【发布时间】:2014-10-20 03:19:43
【问题描述】:

我用单声道 (C#) 编写了一个简单的应用程序,它使用 NHibernate 和 MYSQL - 我现在想将它移植到 SQLite。

我希望(曾经)我可以简单地更改 hibernate.cfg.xml 并将其指向不同的数据库。这是我修改后的hibernate.cfg.xml:

    <?xml version="1.0" encoding="utf-8" ?>

    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
        <session-factory name="NHibernate.Test">
            <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
            <property name="connection.connection_string">
                Data Source=nhibernate_test.db;Version=3
            </property>
            <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
            <property name="query.substitutions">true=1;false=0</property>
            <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
        </session-factory>

</hibernate-configuration> 

问题是我收到一个错误,它无法找到 System.Data.SQLite。这并不让我感到惊讶,因为据我了解,在单声道中我们应该使用 Mono.Data.SQLite。

问题是(假设我正确理解了问题)我不知道如何告诉 NHibernate 使用 Mono.Data.SQLite 而不是 System.Data.SQLite。

这一切都在 Linux 上完成 - 如果这有什么不同的话。

有人知道如何进行吗?

【问题讨论】:

    标签: c# nhibernate sqlite mono


    【解决方案1】:

    您需要让 nHibernate 了解 Mono.Data.SQLite 程序集。将此添加到配置中:

    <add key="connection.driver_class" value="Name.Space.MonoSqliteDriver, AssemblyName" />
    

    你还需要一个简单的MonoSQLiteDriver 类:

    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;  
            }  
        }  
    }  
    

    (代码取自http://intellect.dk/post/Why-I-love-frameworks-with-lots-of-extension-points.aspx

    【讨论】:

    • 谢谢 - 这看起来是一个很好的解决方案,虽然我似乎无法在配置中弄清楚它应该去哪里......
    • 嗯,你能澄清一下它应该去哪里吗?我自己也有问题:-)
    • 是的 - 我将上述类添加到同一个解决方案中的装配项目中,然后您只需将 FirstNHibernate.MonoSqliteDriver, MonoSQLiteDriver 添加到休眠config - 根据需要调整命名空间/程序集名称:-)
    • 我已经在 NHibernate 3.0 中尝试过,但在这里不起作用。在该程序集中搜索 IDb* 接口时失败。您使用哪个版本?
    • @ikutsin,我在使用 4 个参数化的基本构造函数时取得了更好的进展(只需将第一个参数加倍)——这样使用中的程序集就不必事先加载...
    【解决方案2】:

    请注意,您可能需要使用 4 个参数而不是 3 个参数来调用 ReflectionBasedDriver 基类的构造函数,请参阅Using NHibernate and Mono.Data.Sqlite

    【讨论】:

      猜你喜欢
      • 2018-12-28
      • 1970-01-01
      • 2011-01-24
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2012-03-16
      相关资源
      最近更新 更多