实践ORM,创建基于Grove的.NET应用程序(三)

** 实践 ** ** ORM ** ** ,创建基于 ** ** Grove ** ** 的 ** ** .NET ** ** 应用程序(三) ** ** **


撰稿 林学鹏 [email protected]

  1. 在当前项目的 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 层定义

  1. 添加 Customer 和 Address 的添加页面,在 ASPX 页面后置类 aspx.cs 中添加对 Façade 层的引用实现对实体数据的插入,修改,删除等功能。

简单示例:

Customer c=new Customer();

c.CustomerName=” 创特软件 ”;

c.CustomerDesc=”http://www.tryitsoft.com”;

CustomerManager.AddNewCustomer(c );

  1. 在 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));


  1. 当我们需要快速开发,不需要考虑三层或多层应用的时候,实现实体类的自身持久化就很有必要,要实现实体类的自身持久化,必须继承 Grove.DataObject.EntityClassBase 。

简单示例:

Customer c=new Customer();

c.CustomerName=” 创特软件 ”;

c.CustomerDesc=”http://www.tryitsoft.com”;

c.Insert();

  1. *** 关于实体映射多表关系查询 。点 击 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;

Published At
Categories with Web编程
Tagged with
comments powered by Disqus