** 实践 ** ** ORM ** ** ,创建基于 ** ** Grove ** ** 的 ** ** .NET ** ** 应用程序(三) ** ** **
撰稿 林学鹏 [email protected]
- 在当前项目的 Managers 下添加 CustomerManager 类及 AddressManager 类, Managers 层属于商业逻辑层,负责对实体数据库操作的再一次封装。
在商业逻辑层,此处将类构造函数定义成私有,实现 Singleton 模式。
CustomerManager.cs
using System;
using Grove;
using WebApp1.Entities;
using WebApp1.EntityDB;
public class CustomerManager
{
private CustomerManager()
{
}
public static void AddNewCustomer( Customer c)
{
CustomerDB db= new CustomerDB();
db.Insert(c);
}
public static void DeleteCustomer( Customer c)
{
CustomerDB db= new CustomerDB();
db.Delete(c);
}
public static void UpdateCustomer(Customer c)
{
CustomerDB db= new CustomerDB();
db.Update(c);
}
public static EntityData GetAllCustomers()
{
CustomerDB db= new CustomerDB();
return db.SelectAll();
}
}
AddressManager.cs
using System;
using Grove;
using WebApp1.Entities;
using WebApp1.EntityDB;
public class AddressManager
{
private AddressManager()
{
}
public static void AddNewAddress(Address a)
{
AddressDB db= new AddressDB();
db.Insert(a);
}
public static void DeleteAddress(Address a)
{
AddressDB db= new AddressDB();
db.Delete(a);
}
public static void UpdateAddress(Address a)
{
AddressDB db= new AddressDB();
db.Update(a);
}
public static EntityData GetAllAddresses()
{
AddressDB db= new AddressDB();
return db.SelectAll();
}
}
代码 3.Façade 层定义
- 添加 Customer 和 Address 的添加页面,在 ASPX 页面后置类 aspx.cs 中添加对 Façade 层的引用实现对实体数据的插入,修改,删除等功能。
简单示例:
Customer c=new Customer();
c.CustomerName=” 创特软件 ”;
c.CustomerDesc=”http://www.tryitsoft.com”;
CustomerManager.AddNewCustomer(c );
- 在 Customers 和 Addresses 表中, Addresses 表中的 CustomerID 为主表 Customers 的 PK (主键),所以实体类 Address.cs 的属性 CustomerID ,绑定的 DataField() 可以改为 ForeignKeyField() ,在对某个 Customer 操作的时候,可以通过以下方式得到该客户的所有地址。
ArrayList addresses=new ArrayList();
IObjectOperator oo=ObjectOperatorFactory.GetObjectOperator();
oo.RetrieveChildObjects(c.CustomerID,addresses, typeof (Address));
- 当我们需要快速开发,不需要考虑三层或多层应用的时候,实现实体类的自身持久化就很有必要,要实现实体类的自身持久化,必须继承 Grove.DataObject.EntityClassBase 。
简单示例:
Customer c=new Customer();
c.CustomerName=” 创特软件 ”;
c.CustomerDesc=”http://www.tryitsoft.com”;
c.Insert();
- *** 关于实体映射多表关系查询 。点 击 GroveToolKit 的 toolbar 中的 Build Relationship Query 按钮,出现多表关系查询向导,选择 Entity Class 点击下一步,出现 Relation Query Builder 窗口,在窗口的下半部分右击选择 ”Add Table…” 或者在窗口的 toolbar 上点击 Add Existing Table 按钮,出现添加表窗口,分别添加表 Customers 和 Addresses
图 3. 构造关系实体映射
在图 3 中,点击 Customers 表的字段部分(按住鼠标左键)拖动到 Addresses 表的字段区域,并放开鼠标左键,出现两表关系窗口
图 4. 表间关系属性
在图 4 中选择 Addresses 表的 CustomerID 列后,点击 OK ,如果需要指定两表之间是左关联、右关联或者全外关联,请选择 Include rows 下的选项。
图 5. 关系生成后
在图 5 中,右击 Customers 表选择 Select all columns 或选择 Table Property 后选择需要显示的列。
图 6. 选择表的显示列
在图 5 中,选择 Addresses 表需要显示的列,然后点击当前窗口 toolbar 上的执行按钮,如果正确执行,执行结果将会显示在当前窗口,现在,点击 toolbar 上的 Preview relation query class 按钮预览关系实体映射类。
CustomersRelationQuery .cs
using System;
using Grove.DataObject;
[RelationTable("CustomersRelationQuery",BeginWithTable="Customers")]
public class CustomersRelationQuery
{
[RelationReflect("Customers","Addresses")]
[RelationField("CustomerID","AddressID")]
public string Relationship_1
{
get{ return "[Customers].[CustomerID]=[Addresses].[AddressID]";}
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left;