适用于 .NET 的后关系数据库简介:Matisse - 第 5 部分






4.73/5 (20投票s)
2004 年 3 月 30 日
4分钟阅读

97922
使用后关系数据库进行面向对象编程。
引言
本系列文章的 第 3 部分 和 第 4 部分 分别介绍了使用 Matisse 后关系数据库 进行 .NET 编程;使用“对象 API”插入对象,以及分别在不使用映射工具的情况下使用 ADO.NET 和 SQL 从数据库检索对象。在本文中,我将展示如何使用对象 API 来更新和删除对象、使用索引查找对象以及进行关系导航。
对象 API 为操作 Matisse 对象提供了面向对象的接口。这些 API 由 mt_stbgen
代码生成工具生成。何时应该使用对象 API(或 ADO.NET)?以下是我的回答:
- 当您使用数据感知控件时,需要使用 ADO.NET。
- 使用对象 API 来创建、更新和删除对象。您也可以为此目的使用 SQL 存储过程。我将在接下来的文章中讨论这个问题。
- 使用 ADO.NET 来检索对象。但是,如果您可以使用索引来查找对象,请使用对象 API 的索引以获得更好的性能。
- 如果可以从一个对象导航到另一个对象,请使用对象 API 进行导航。这比发出另一个 SQL 查询来获取同一个对象要快得多。
大多数情况下,对象 API 的性能优于 ADO.NET。此外,对象 API 通过在编译时(而不是运行时)检查许多内容来最大程度地降低程序出错的风险。
以下是之前的文章列表:
更新属性
以下代码段是 Project
类的一部分,该类由 mt_stbgen
代码生成工具生成。(我将继续使用与前几篇文章相同的数据库模式。)无需关注代码细节,只需注意它定义了一个 C# 属性。
namespace MatisseApp {
using System;
using com.matisse.reflect;
using com.matisse.Data;
using com.matisse;
// A class generated by Matisse
/// <summary>
/// Project is a schema class generated by Matisse.
/// </summary>
public class Project : MtObject {
// Generated constructor
/// <summary>
/// Default constructor provided as an example.
/// You may modify or delete this constructor
/// </summary>
public Project(MtDatabase db) :
base(GetClass(db)) {
}
// Generated property, do not modify
/// <summary>
/// Property for attribute 'Budget'
/// </summary>
public System.Decimal Budget {
get {
return GetNumeric(GetBudgetAttribute(Database));
}
set {
SetNumeric(GetBudgetAttribute(Database), value);
}
}
由于 Project
类已在数据库中定义了类型为 decimal 的 Budget
属性,因此生成的 C# 类具有如上所示的 Budget
属性。当您更新 Matisse 对象属性的值时,只需使用属性的 set 访问器即可。
Project prj;
// Retrieve a Project object from the database and assign it to prj
// Update the value of the project's budget
prj.Budget = prj.Budget + 200000;
关系导航和更新
使用后关系数据库的一个主要优势在于,您可以轻松地在对象之间导航,例如,从 Project
对象获取 Manager
对象。下一段代码是 Project
类的一部分,它定义了访问两个关系(Members
和 ManagedBy
)的属性。同样,我们不要关注代码细节,但请注意它定义了两个 C# 属性。
// Generated property, do not modify
/// <summary>
/// Property 'Members': Gets and sets the 'Members' successors
/// </summary>
public Employee[] Members {
get {
return ((Employee[])
(GetSuccessors(GetMembersRelationship(Database), typeof(Employee))));
}
set {
SetSuccessors(GetMembersRelationship(Database), value);
}
}
// Generated property, do not modify
/// <summary>
/// Property 'ManagedBy': Gets the 'ManagedBy' successor
/// </summary>
public Manager ManagedBy {
get {
return ((Manager)(GetSuccessor(GetManagedByRelationship(Database))));
}
set {
SetSuccessor(GetManagedByRelationship(Database), value);
}
}
以下程序检索一个项目的经理和成员,然后为该项目设置其他经理和成员。
Project prj;
// Retrieve a Project object from the database and assign it to prj
Manager mgr = prj.ManagedBy;
Employee[] members = prj.Members;
// Update the relationships
Manager otherManager;
Employee[] otherMembers;
prj.ManagedBy = otherManager;
prj.Members = otherMembers;
其他关系 API
代码生成器提供了更多访问关系的 API。下面的列表是为 Project
类的 Members
关系生成的函数。
Members 关系 API | 描述 |
MembersSize | 返回关系中对象的数量(后继项),即项目的成员数量。 |
MembersEnumerator | 返回一个枚举器来迭代关系中的对象。 |
PrependMembers | 在关系开头添加新成员。 |
AppendMembers | 在关系末尾添加新成员。 |
RemoveMembers | 删除成员。 |
ClearMembers | 删除关系中的所有成员。 |
使用索引查找对象
Matisse SQL 优化器利用索引来优化查询性能,但您也可以使用代码生成器生成的索引 API。索引 API 的性能比动态 SQL 稍快,因为它们不需要 SQL 语句编译,并且您的程序也更简单。但是,只有当您的搜索条件包含在单个索引中时,您才能使用这些 API;否则,您需要使用 SQL 查询。
假设您已在 ProjectName
属性上定义了一个索引 ProjNameIndex
。下一行代码返回一个名为“Whidbey
”的 Project
对象。
Project prj = Project.LookupProjNameIndex (dbconn, "Whidbey");
这很简单。请注意,还有其他 API 允许您进行范围查询。
全文搜索
Matisse 具有全文索引功能,称为“入口点字典”。例如,如果您需要在项目描述属性上执行全文搜索,请定义一个入口点字典,如下所示:
CREATE ENTRY_POINT DICTIONARY proj_desc_ep_dict
ON Project (Description)
MAKE_ENTRY "make-full-text-entry";
下一段代码检索所有描述包含“.NET
”一词的项目。
foreach (Project prj in Project.Proj_desc_ep_dictEnumerator(
dbconn, ".NET") {
// ...
}
总结和下一篇文章
本文介绍了使用“对象 API”进行 Matisse 数据库编程的基础知识。虽然使用 ADO.NET 或对象 API 几乎可以完成任何事情,但 ADO.NET 通常更适合查询,而对象 API 在其他方面则更简洁高效。
在我的下一篇文章中,我将展示一些使用 Matisse 进行 ASP.NET 编程的示例。
历史
- 2004 年 3 月 30 日:初始版本
许可证
本文未明确附加任何许可证,但可能在文章文本或下载文件中包含使用条款。如有疑问,请通过下方的讨论区联系作者。作者可能使用的许可证列表可在 此处 找到。