65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SQLite 嵌入式数据库与 Entity Framework 和 Linq-to-SQL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (46投票s)

2011年8月5日

CPOL

9分钟阅读

viewsIcon

290353

downloadIcon

7893

使用 SQLite 嵌入式数据库与 Entity Framework 和 Linq-to-SQL。

目录

  • 引言
  • 添加提供程序
  • SQLite 管理工具
  • 使用 Visual Studio 2010 或 SQLite Administrator 编辑 SQLite 数据库
  • 在 Visual Studio 2010 中使用 SQLite 和 Entity Framework
  • 使用 SQLite 的任务管理示例
  • 摘要

引言

时不时地,我们需要一个简单、轻量、小巧且易于使用的数据库解决方案。还有什么比 SQLite 更方便的呢?SQLite 是一个简单但功能强大的工具,可以支持各种应用程序的需求。在我们开始这项研究工作时,我们主要关注的是根据一些标准选择合适的数据库。

  • 我们不想使用基于服务的数据库,而是文件系统数据库。
  • 客户端必须轻量、快速并支持 BLOB 数据。
  • 我们不想在客户端机器上安装任何客户端或框架。

对于 Web 和小型数据库而言,SQLite 正在成为一个非常方便的嵌入式数据库,而且有些人因为其大小、性能和对大数据支持的优势而偏爱 SQLite 而非 SQL Server Compact Edition。在对数据库的几个方面进行研究后,我决定将我在探索 Visual Studio 2010 的用法和便捷性时获得的经验整理出来。在这篇短文中,我们将介绍如何使用 ADO.NET Entity Framework,然后如何将 Linq to SQL 与 SQLite 数据库一起使用。

添加提供程序

下一步是在 Visual Studio 2010 的服务器资源管理器中添加数据连接。当你点击添加连接时,默认情况下,Visual Studio 中没有添加提供程序,因此我们需要使用第三方工具来添加它。你可以从 http://sqlite.phxsoftware.com/ 网站下载 SQLite 的提供程序。在本例中,我们使用的是“SQLite-1.0.66.0-setup”版本。安装此提供程序后,将提供一个选项将其集成到 VS2008 和 VS2010 中。安装提供程序后,回到服务器资源管理器中的添加数据连接,你将看到一个新的 SQLite 提供程序可用。

SQLite_Provider_thumb_1_.jpg

在服务器资源管理器中添加连接

选择 SQLite 数据库文件后继续。接下来,我们将看到一个屏幕,你可以在其中选择现有数据库或创建新的数据库文件。

就是这样!你的连接字符串和数据库连接现已设置完毕,你可以开始设计数据库了。关于此特定案例的一些有趣说明。SQLite 数据库目前还没有数据库图表支持,但我们希望很快就能提供。添加连接后,我们可以创建表并将必要的关联添加到表中。

在本节中,我们看到了如何轻松地在 Visual Studio 2010 中使用提供程序在服务器资源管理器中创建连接来使用 SQLite。接下来,我们将讨论如何使用 SQLite 创建一个数据层,使用 Entity Framework,但在那之前,让我们快速了解一个简单的 SQLite 数据库管理工具。

SQLite 管理工具

SQLite 有很多管理工具,其中一些是开源的,一些是试用版,还有一些是商业软件。我认为“SQLite Administrator”是一个非常易于使用且方便的工具,对于 SQLite 数据库文件而言。

SQLite 管理工具的完整列表可以在“http://sqlite.com/cvstrac/wiki?p=ManagementTools”中找到。选择最适合你的工具即可。

在这里,我将只讨论 SQLite Administrator。** **你可以从以下网站下载:

Edit_Table_in_SQLite_Administrator.PNG

注意

这个工具不需要任何安装。整个软件包在一个 zip 文件中,不需要任何安装,只需解压缩并打开 EXE 文件即可,所有功能都非常简单,并且具有非常直观的用户界面。我向所有使用 SQLite 的人推荐它。

使用 Visual Studio 2010 或 SQLite Administrator 编辑 SQLite 数据库

在前一节中,我分享了一些关于 SQLite 嵌入式数据库的有用信息,以及如何使用 System.Data.SQLite 的提供程序来创建连接。我们还了解了一个名为“SQLite Administrator”的简单工具,它与 SQLite 数据库一起使用非常方便。在这篇短文中,我们将看到如何使用 Visual Studio 2010 或 SQLite Administrator 创建和操作数据。

在 Visual Studio 2010 中创建表

选择你创建的 SQLite 连接,展开“表”节点,然后右键单击并选择“添加新表”,就是这样。你可以像下面的图一样添加表。我敢肯定你们已经在一千八百次地在 SQL Server 中做过这件事了,这次只是 SQLite。当你第一次进入表编辑器进行编辑时,可能会看到一个警告。

使用 SQLite Administrator

双击 SQLite 数据库文件,然后右键单击表并点击“创建表”,其余的用户界面也非常方便地创建表。将字段设置为主键或为主键分配自动递增,都可以通过简单的点击完成。因此,不再需要手动编写自定义 SQL。

在 Visual Studio 2010 中创建关系

在 Visual Studio 中创建表关系很容易,只需单击关系图标,即主键旁边的图标,准确地说,是主键按钮右侧的图标。或者,你可以选择一个表然后单击“关系”,这将弹出一个小部件来创建关系。

创建自动递增主键也不算太难,如今我们几乎在每个表中都使用自动递增键,所以我们必须讨论一下。乍一看,我们没有找到直接分配它的按钮或选项。你可以使用 SQLite Administrator 通过几次点击来添加它,但要在 Visual Studio 2010 中添加,你需要打开“索引”窗口,只需点击“索引”,之后你就会找到一个添加自动递增列的选项。

AddRelation_thumb_1_.png

在 Visual Studio 2010 中使用 SQLite 和 Entity Framework

在前一节中,我们已经看到了 http://sqlite.phxsoftware.com/ 提供的简单“数据提供程序”如何在 .NET 环境中使 SQLite 的使用更加轻松。在本节中,我们将介绍如何使用 SQLite 生成 Entity Framework 数据模型。

选择提供程序

最重要的一点是首先在 Visual Studio 2010 中创建任何类型的项目,但我会推荐一个 Web 应用程序、Windows 窗体或 WPF 应用程序。现在点击“项目”并选择“添加新”项来添加新的项目类型。在“添加新项”向导中,选择“ADO.NET Entity Data Model”并单击“添加”,这将弹出 Entity Data Model 向导。

  • 步骤 1:从数据库生成。
  • 步骤 2:在下一个窗口中,选择“新建连接”。
  • 步骤 3:将弹出“连接属性”窗口,然后我们必须选择正确的 SQLite 提供程序。
  • 步骤 4:之后,“连接属性”将显示“浏览”或“新建数据库”。
  • 步骤 5:如果使用“浏览”则选择现有数据库,如果使用“新建”则创建新数据库。
  • 步骤 6:继续向导,选择要包含在模型中的数据库表项。
  • 步骤 7:单击“完成”关闭向导,将为您生成一个数据模型。

Data_Model_Created_thumb_4_.png

如果数据库中有任何关系,它们将自动同步到数据模型中,就是这样。我们可以开始编写代码来检索数据并执行我们必须在数据库中执行的所有必要操作。祝你好运,编码愉快。

将 LINQ-to-SQL 与 SQLite 数据库结合使用

在前一节中,我们讨论了如何将 ADO.NET Entity Framework 与 SQLite 数据库结合使用。并且我们已经看到,在有合适的提供程序的情况下,它在易用性方面几乎与 SQL Server 相同。

今天我们将介绍如何将 Linq-to-SQL 与 SQLite 数据库结合使用。我们总是寻求能让我们的生活更轻松的方法,最重要的是不再重复造轮子。默认情况下,你无法将表从服务器资源管理器或数据连接拖放。这是因为我们没有内置的支持 Linq 的提供程序,如果你尝试这样做,你肯定会遇到以下错误:

AddRelation.png

现在,我知道我要展示的内容可能不会让你满意,但它肯定能达到我们使用 Linq 与 SQLite 结合的目的。这背后没有魔法或火箭科学,我们有一个 DBLinq 开源发行版,它支持各种数据库。对于本例,让我们坚持使用 SQLite。二进制文件可以在这里找到:http://code.google.com/p/dblinq2007/,请从此网站下载最新的二进制文件。

现在是时候生成 OurDatabase.dbml 文件了。步骤并不复杂,找到你从 Google Code 下载的 DBLinq 包,然后将其解压缩到一个方便访问的文件夹位置。

请注意,你需要将 System.Data.SQLite DLL 复制到 DBLinq 目录中。

Commands.png

步骤 1:创建 dbml 文件

DbMetal /provider:Sqlite /conn "Data Source=File.db3" /dbml:File.dbml

步骤 2:为 dbml 文件创建代码文件

DbMetal /code:File.cs File.dbml

将这些文件复制到 Visual Studio。就是这样!一切准备就绪。

Generated_DBML.PNG

通过点击生成来确保一切都能正常编译。下面我提供了一个简单的代码片段,演示如何使用这个 dbml 来检索数据。

public static void GetData()
    {
        string ConStr = "Data Source=" + 
	  HttpContext.Current.Server.MapPath("App_Data\\PersonalExpenseDB.s3db") +
                        ";Version=3;";

        var connection = new SQLiteConnection(
            ConStr
            );

        connection.Open();

        var db = new Main(connection, new SqliteVendor());

        var users = db.User;

        var item = users.Take(10).ToList();
    }

使用 SQLite 的任务管理示例

在本节中,我整理了一个简单的任务编辑代码,只有两个字段:标题和描述。这只是为了演示如何在实际编码中应用上述想法。对于本例,我使用了 ADO.NET Entity Framework。下面提供了最重要的几个方法的代码片段:

//load task
private void LoadTasks()
{
    var db = new PersonalExpenseDBEntities();
    var tasks = db.Tasks.ToList();
    RepeaterTasks.DataSource = tasks;
    RepeaterTasks.DataBind();
}

//add new task
private void AddNewTask()
{
    var db = new PersonalExpenseDBEntities();
    Task task;
    if (EditTaskId > 0)
    {
        task = db.Tasks.Where(p => p.ID == EditTaskId).SingleOrDefault();
        if (task != null)
        {
            task.Description = TextBoxDescription.Text.Trim();
            task.Title = TextBoxTitle.Text.Trim();
        }
        EditTaskId = 0;
    }
    else
    {
        task = new Task {Description = TextBoxDescription.Text.Trim(), 
        		Title = TextBoxTitle.Text.Trim()};
        db.AddToTasks(task);
    }
    db.SaveChanges(true);
}

//delete task
private static void DeleteTask(CommandEventArgs e)
{
    var db = new PersonalExpenseDBEntities();
    var argument = e.CommandArgument;
    int taskId = Convert.ToInt32(argument);
    var editingTask = db.Tasks.Where(p => p.ID == taskId).SingleOrDefault();
    db.DeleteObject(editingTask);
    db.SaveChanges();
}

//populate task
private void PopulateEditingTask(CommandEventArgs e)
{
    var argument = e.CommandArgument;
    int taskId = Convert.ToInt32(argument);
    var db = new PersonalExpenseDBEntities();
    var editingTask = db.Tasks.Where(p => p.ID == taskId).SingleOrDefault();
    if (editingTask != null)
    {
        TextBoxTitle.Text = editingTask.Title;
        TextBoxDescription.Text = editingTask.Description;
    }
    EditTaskId = taskId;
}

请注意,在使用向导创建连接字符串时,你可能会得到一个与应用程序无关的数据库路径。因此,请修改连接字符串,使其从 app_data 获取相对路径。

摘要

在这篇短文中,我们看到了如何使用各种工具来管理 SQLite 数据库。以及如何使用一些有用的工具将其与 Linq-to-SQL 结合使用。我们还看到了如何使用提供程序在 Visual Studio 2010 中获得一些本地支持来设计和管理 SQLite 数据库。最后,我们还看到了如何使用 SQLite 和 Entity Framework 来执行一些数据库操作。

© . All rights reserved.