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

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.93/5 (12投票s)

2007 年 9 月 7 日

CPOL

3分钟阅读

viewsIcon

24097

介绍使用免费的 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”(定义)选项卡。首先,请确保选择了所有三个表(UnitRecipeIngredient)。Diamond Binding 会默认自动启用所有合理的关联。在此特定场景中,我们对恰好引用特定 UnitIngredient 列表不感兴趣,因为 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 提供的一些强大功能有了一定的了解。在未来的指南中,我们将探讨更复杂的功能,例如一对多关系、继承、表达式和级联更新。

© . All rights reserved.