使用 Diamond Binding 更轻松地访问数据库(第 2 部分)
介绍使用免费的 Diamond Binding Personal Edition 进行 ORM 的好处。
引言
在我们第一篇文章 使用 Diamond Binding 更轻松地访问数据库(第 1 部分)中,我们构建了一个简单的对象关系数据访问层来加载和保存配方。在本例中,我们将扩展 Recipe
数据库,添加一个名为 Ingredients
的新表和一个名为 Units
的新表。最后,我们将探讨如何使用 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]
Unit
表包含单位列表,例如“茶匙”、“杯”和“克”。
CREATE TABLE [dbo].[Unit](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50)
CONSTRAINT [PK_Unit] PRIMARY KEY CLUSTERED ([Id] ASC)
)
Ingredient
表包含食谱的配料,此外还有单位和数量。例如,表示“3 茶匙糖”。
CREATE TABLE [dbo].[Ingredient](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Quantity] [int] NOT NULL,
[Unit] [int] NOT NULL REFERENCES [dbo].[Unit] ([Id]),
[Recipe] [int] NOT NULL REFERENCES [dbo].[Recipe] ([Id]),
CONSTRAINT [PK_Ingredient] PRIMARY KEY CLUSTERED ([Id] ASC)
)
 
创建业务层
创建完新数据库表后,请加载您在上一个教程中创建的 Diamond Binding Recipe 解决方案。我们将告知 Diamond Binding 新表和关系,因此请转到 Diamond Binding 菜单,选择“Edit Current”(编辑当前),然后再次单击“Definitions”(定义)选项卡。首先,请确保选择了所有三个表(Unit
、Recipe
和 Ingredient
)。Diamond Binding 会默认自动启用所有合理的关联。在此特定场景中,我们对恰好引用特定 Unit
的 Ingredient
列表不感兴趣,因为 Unit
表只是一个预先填充的列表(例如“茶匙”)。因此,通过取消选中 Unit
表下的 Ingredient.Unit
关联来删除此关联。所有其他设置都正常,因此只需按“Ok”即可。Diamond Binding 现在将自动重新同步项目定义,您应该会看到新类出现。
定制业务层
在设计数据库时,我们在 Ingredient
表中添加了一个指向 Recipe
表的外部键,因为我们打算允许 Recipe
拥有一个 Ingredients
列表。在 Recipe
类中,Diamond Binding 将创建一个名为 Ingredient_Recipe
的属性;这是一个强类型化的 Ingredients
列表。此属性的命名基于 Ingredient
表及其表的外部键列 Recipe
。我们将此属性重命名为 Ingredients
,因为它更方便。打开用户类 Recipe.cs,并将以下 Ingredients
属性添加到类中。
public IList Ingredients
{
get
{
return Ingredient_Recipe;
}
}
我们已成功将 Ingredient_Recipe
属性重命名为 Ingredients
,方法是包装 Diamond Binding 生成的 Ingredient_Recipe
属性。但是,旧的 Ingredient_Recipe
属性仍然是公开可访问的。要更改这一点,请在 Diamond Binding 项目配置中,编辑 Ingredient.Unit
关联的定义,并将字段可访问性从 Default
更改为 Protected
。请注意,如果以这种方式重命名属性,在使用 Hibernate 查询语言时,仍然需要使用其原始名称引用该属性。
加载和保存对象
保存新食谱
将以下代码添加到控制台应用程序
//Create a new Recipe – Chicken Fondue
Recipe recipe = new Recipe();
recipe.Name = "Honey Garlic Chicken Fondue";
recipe.Instructions = "Empty";
//Create an new Ingredient - Chicken
Ingredient i = new Ingredient();
i.Name = "Chicken";
i.Quantity = 600;
//Create a new unit - grams
Unit unit = new Unit();
unit.Name = "grams";
i.Unit = unit;
recipe.Ingredients.Add(i);
//Persist to database.
recipe.Save();
在这里,我们在数据库中保存了一个鸡肉火锅食谱,其中包含一个配料:600 克鸡肉。我们所要做的就是设置一些属性,将一个新配料添加到 Ingredients
集合中,最后调用 recipe.Save()
。我们之所以只需要调用 Recipe
类的 save
,是因为 Diamond Binding 知道 Ingredient.Recipe
外部键关系,并且级联设置已设置为 SaveUpdate
。
摘要
在本篇文章中,我们了解了 Diamond Binding 如何使我们的业务对象之间的关系非常直观。希望您现在已经对 Diamond Binding 提供的一些强大功能有了一定的了解。在未来的指南中,我们将探讨更复杂的功能,例如一对多关系、继承、表达式和级联更新。