让流畅的NHibernate与SQLite一起使用

时间:2011-04-14 15:04:25

标签: nhibernate sqlite fluent-nhibernate system.data.sqlite

我确信有一些简单的事情我还没有完成,但我想让Fluent NHibernate在我的机器上使用Sqlite。

我使用NuGet下载流畅的nhibernate并添加了以下实体和映射:

public class Customer
{
    public virtual string CustomerCode { get; set; }
    public virtual string Name { get; set; }
}

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap ()
        {
        Id(x => x.CustomerCode);
        Map(x => x.Name);
        Table("tblCustomer");
        }
}

然后,在开始使用流畅的指南后,我将以下代码添加到Windows Command项目中:

class Program
{
    static void Main(string[] args)
    {

        var sessionFactory = CreateSessionFactory();

        using (var session = sessionFactory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {

                var customer = new Customer { CustomerCode = "123", Name = "Bob" };
                session.SaveOrUpdate(customer);
                transaction.Commit();
            }
        }
    }

    private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(
            SQLiteConfiguration.Standard
            .UsingFile("firstProject.db")
            )
            .Mappings(m =>
                        m.FluentMappings.AddFromAssemblyOf<Program>())
            .ExposeConfiguration(BuildSchema)
            .BuildSessionFactory();
    }

    private static void BuildSchema(Configuration config)
    {
        // delete the existing db on each run
        if (File.Exists("firstProject.db"))
            File.Delete("firstProject.db");

        // this NHibernate tool takes a configuration (with mapping info in)
        // and exports a database schema from it
        new SchemaExport(config)
          .Create(false, true);
    }
}

最后我使用NuGet添加了Sqlite dll ..但是在尝试运行程序时出现以下错误:

最高例外:

An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

下一个例外:

Could not create the driver from NHibernate.Driver.SQLite20Driver, NHibernate, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4.

内心最常见的例外:

Unable to find the requested .Net Framework Data Provider.  It may not be installed.

这是在尝试创建会话工厂的时候。

任何人都可以帮忙吗?我正在运行32位机器?

由于

戴夫

7 个答案:

答案 0 :(得分:12)

你需要两件事:

  1. 在您的项目中引用System.Data.SQLite
  2. 包含sqlite3.dll,但您也无法添加对sqlite3.dll的引用,因为它是一个非托管的dll。只需将其作为元素添加到解决方案中,并将其设置为复制到输出目录。

答案 1 :(得分:5)

您需要Sqlite的.NET提供程序。在此处下载http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

答案 2 :(得分:5)

经过初步调查后,我认为这是因为我的System.Data.SQLite程序集当时没有加载到内存中,因此我提供了代码来预加载system.Data.SQLite程序集。但是,在运行应用程序时出现了真正的错误:

混合模式程序集是针对运行时的版本“v2.0.50727”构建的,如果没有其他配置信息,则无法在4.0运行时加载。

要解决此问题,我将app.config更改为如下所示:

<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

重要位为 useLegacyV2RuntimeActivationPolicy =“true”

答案 3 :(得分:1)

我今天遇到了同样的问题,花了一个小时寻找解决方案。无论如何,我在这里找到了一个:

http://thelongwayback.wordpress.com/2009/11/02/fluent-nhibernate-sqlite-problem-the-idbcommand-and-idbconnection-implementation-in-the-assembly-system-data-sqlite-could-not-be-found/

基本上,你必须从这里使用旧版本的SQLite(v1.0.60): http://sourceforge.net/projects/sqlite-dotnet2/files/

另一方面,我在昨天使用VS2010 SP1的机器上获得了相同的代码。今天在没有SP1的机器上运行相同的代码。如果有人有机会测试这个,即安装VS2010 SP1,请告诉我结果。

答案 4 :(得分:1)

上述解决方案或我在互联网上找不到的任何其他解决方案都不适合我......直到......

我必须安装x64和x86版本的SQLite(每个Vadim的链接:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki),特别按顺序安装。

最初,我在64位版本之前安装了32位,但没有修复任何问题。一时兴起,我将它们全部卸载并以相反的顺序重新安装它们。现在它有效!

我已经在2台不同的机器上测试了这个并验证了这是两者的修复。古怪,但有效。

答案 5 :(得分:0)

我也遇到过这个问题 注意到入门示例项目的目标是.net 框架3.5 ,我创建的那个(练习项目)的目标是.net 框架4.0 客户端配置文件(默认为vs2010)。 /> 我将目标版本更改为3.5,并且我能够处理我的锻炼项目。

答案 6 :(得分:0)

就我而言,它可以通过NuGet安装System.Data.SqLite。

因此,我打开了“工具/ NuGet程序包管理器/程序包管理器控制台”并输入:

Install-Package System.Data.SqLite