使用 Diamond Binding 更轻松地访问数据库( 第 1 部分)






1.11/5 (17投票s)
2007年8月23日
5分钟阅读

27124
介绍使用免费的 Diamond Binding Personal Edition 进行 ORM 的好处。
引言
Code Project 的许多人都会熟悉 ORM 和 Active Record 模型。然而,环境设置、映射文件以及类的创建都是开发人员面临的重大障碍。即便如此,与传统的硬编码数据层相比,ORM 仍然提供了显著的优势,并且有各种工具可用——从最简单的基于模板的生成器到全包式解决方案——这些工具都试图减轻开发人员的负担。
对于本文,我们决定 Diamond Binding 的易用性和 Visual Studio 集成使其成为一个合适的工具,以在实际情况中演示 ORM 的优势。我们注意到 Diamond Binding 可以在我们正常的开发流程中工作,而不会“接管”它,并且配置就像勾选我们感兴趣的表一样简单。最重要的是,它提供了一个免费版本!
我们将构建一个小型示例应用程序——一个用于编目烹饪食谱的应用程序。该应用程序将命名为 RecipeDemo,它将在 SQL Server 数据库中存储烹饪食谱说明、配料和单位列表。我们将通过几篇文章采用迭代方法来开发 RecipeDemo,因为我们想展示使用 Diamond Binding 这样的工具如何真正加快开发过程。
目录
安装
要阅读本文,您需要安装 Microsoft Visual Studio 2005,并且能够访问 Microsoft SQL Server(您可以在其中创建测试数据库),以及 Dunn & Churchill Diamond Binding。
创建数据库
首先,我们需要创建演示数据库
CREATE TABLE Recipe( [Id] int IDENTITY(1,1) NOT NULL, [Name] nvarchar(50) NOT NULL, [Instructions] nvarchar(max) NOT NULL, CONSTRAINT [PK_Recipe] PRIMARY KEY ( [Id] ASC ) ) ON [PRIMARY]
我们的演示数据库有一个名称、一个用于存放说明的地方,以及一个简单的自动递增主键。
创建业务层
在 Visual Studio 中,创建一个名为 DiamondGettingStarted.Data 的新类库项目。在 Solution Explorer 窗口中选择空项目,然后打开 Project 菜单。您应该会看到一个新的 Diamond Binding 菜单选项;如果没有,请确保 Diamond Binding 已在 Tools 菜单的 Add-In Manager 中安装并启用。
连接到数据库
在 Solution Explorer 中选择您的项目。在 Diamond Binding 菜单下,选择 Edit Current。使用此对话框通过选择合适的 OLE DB 提供程序(例如 Microsoft OLE DB Driver for SQL Server)来连接到我们的食谱数据库。如果您提供了用户名和密码,您需要确保选中“Allow Password Saving”复选框,以便 Diamond Binding 在需要重新同步定义时能够记住密码。
配置定义
连接到 RecipeDemo 数据库后,将显示 Diamond Binding 项目配置表单。将 General 选项卡设置保留为默认值,然后单击 Definitions 选项卡。勾选 Recipe 表旁边的复选框,以表示您希望为它创建定义文件。按 Ok,稍后一个名为 Recipe 的新类将被添加到项目中,其中包含 Recipe 表中的所有字段。
创建应用程序项目
接下来,我们将使用新的业务层来演示加载和保存食谱记录,我们将为此目的仅使用一个控制台应用程序。向解决方案中添加一个新的控制台项目,并添加对我们业务项目的引用。在此阶段,您还应该添加对以下 Diamond Binding 运行时程序集的引用;
- DunnChurchill.Data.DiamondBinding
- DunnChurchill.Data.DiamondBinding.ActiveRecord
- DunnChurchill.Data.DiamondBinding.Core
- NHibernate
默认情况下,这些程序集位于 C:\Program Files\Dunn & Churchill\Diamond Binding\Runtime 文件夹中。
配置运行时
配置 Diamond Binding 运行时的最简单方法是使用标准的 App.config 文件,向控制台项目添加一个,然后粘贴以下 XML
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="activerecord" type="DunnChurchill.Data.DiamondBinding.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, DunnChurchill.Data.DiamondBinding.ActiveRecord, Version=1.2.1.3, Culture=Neutral, PublicKeyToken=6e7b61d5b7adddc4" /> </configSections> <connectionStrings> <add name="SqlServer" connectionString="{your connection string}"/> </connectionStrings> <activerecord namingstrategytype="DunnChurchill.Data.DiamondBinding.SqlServerNamingStrategy, DunnChurchill.Data.DiamondBinding, Version=1.2.1.3, Culture=Neutral, PublicKeyToken=6e7b61d5b7adddc4"> <config> <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /> <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" /> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="hibernate.connection.connection_string_name" value="SqlServer" /> </config> </activerecord> </configuration>
将 connectionString 替换为指向您的数据库的有效 SQL Native Client 连接字符串。这很可能与为您在 Diamond Binding 项目配置中创建的连接字符串相同,但不包含 Provider 项。
在我们准备好开始持久化业务对象之前,最后一步是初始化 Diamond Binding 运行时。这可以通过在应用程序开头粘贴以下一行代码来简单完成(为了清晰起见,此处显示了 using 指令)
using DunnChurchill.Data.DiamondBinding.ActiveRecord; using DunnChurchill.Data.DiamondBinding.ActiveRecord.Framework.Config; ... // Initialize the Diamond Binding Runtime ActiveRecordStarter.Initialize(typeof(Recipe).Assembly, ActiveRecordSectionHandler.Instance);
加载和保存对象
现在是最简单的部分,base ActiveRecord 类提供了保存和加载记录的重载;以下代码演示了如何持久化新的 Recipe 记录
保存
Save 函数持久化对现有记录的任何修改。如果记录的主键同时也是 Identity 列(如我们的食谱数据库那样),Save 函数足够智能,可以在记录是新的时执行插入,或者在记录已存在时执行更新。
//Create recipe and persist it to the database Recipe recipe = new Recipe(); recipe.Name = "Honey Peanut Granola"; recipe.Instructions = "Test"; recipe.Save();
Create
Create 函数将新记录插入数据库。如果主键不是 Identity 列,则应调用此函数而不是 Save 来指示记录应该被插入。
//Create recipe and persist it to the database Recipe recipe = new Recipe(); recipe.Name = "Honey Peanut Granola"; recipe.Instructions = "Test"; recipe.Create();
查找
Find 函数按主键加载记录。
Recipe recipe = Recipe.Find(1); Console.WriteLine("Recipe: {0}", recipe.Name);
Find All
FindAll 函数返回表中每个记录的数组。
Recipe[] recipes = Recipe.FindAll<recipe>(); foreach (Recipe recipe in recipes) { Console.WriteLine("Found recipe '{0}'", recipe.Name); } </recipe>
Find By Property
FindByProperty 函数返回与属性匹配的数组。转到 Recipe.cs 类,并添加以下函数
public static Recipe[] FindByName(string name) { return Recipe.FindAllByProperty("Name", name); }
使用此函数很简单
//Find a specific recipe by name foreach (Recipe recipe in Recipe.FindByName("Honey Peanut Granola")) { Console.WriteLine("Found recipe '{0}'", recipe.Name); }
注意:Diamond Binding 足够智能,不会覆盖 Recipe.cs 文件,因此将自己的业务逻辑放在那里是合适的。请记住,在处理 Find 系列函数时,您正在查询对象模型,因此字段和类名是指代码中出现的名称。
摘要
到目前为止,我们已经研究了如何使用 Diamond Binding 将业务对象映射到 SQL 表,如何持久化记录,以及如何向一个托管类添加业务逻辑查询。在后续文章中,我们将探讨关系如何处理,类继承(是的,在数据库应用程序中!),以及更高级的查询。