轻量级数据持久层 Seaking.PL 2.1 使用说明 (二)

4.Session的使用
Session必须由 DataProvider 的实例生成,如上代码所示。

4.1添加实体
实例化实体类的实例后并调用 Session 的 Insert 方法:

Employee employee = new Employee();
employee.Name 
= "Mike";
em.Age 
= 10;
session.Insert(employee);

如果实体的主键属性不标识类型,不应该指定实体的主键属性值(即使指定,PL在执行插入操作时也会忽略),插入成功后,主键属性自动被赋为自动产生的标识值。但特殊情况下可能需要按照指定值插入标识型的属性,这时可以使用 Insert 方法的一个重载:

Employee employee = new Employee();
em.ID 
= 1;
employee.Name 
= "Mike";
em.Age 
= 10;
session.Insert(employee, 
true);

4.2获取实体
根据主键获取单个实体使用 Session 的 Retrive 方法:

Employee employee = session.Retrieve<Employee>(1);

如果数据源中不存在配置的数据,将返回 null 。

4.3更新实体
实体的修改实体的属性后,调用 Session 的 Update 方法可以将更新提交到数据源。

employee.Age = 11;
session.Update(employee);

注意:Session更新数据源时将以主键属性作为更新的依据,因此该操作不能更改主键属性,否则可能会出现不符合意愿的结果。

4.4删除实体
可能使用Session的 Delete 方法删除实体:

session.Delete(employee);

或根据实体的类型及主键值进行删除:

session.Delete<Employee>(1);

4.5保存实体
保存包括实体的添加及更新,调用 Session的 Save 方法时,Session将自动对实体进判断,如果实体的主键属必来标识类型且值为空将调用 Insert 方法。主键属性值不为空时,如果数据源中存在配置数据将调用 Update 方法,否则调用 Insert 方法。该方法为 Insert 及 Update 提供了通用的操作,但是会造成一定的性能损失。

4.6建立标准
对实体进行批量操作时应使用标准,以下代码是一个最简单的、无条件的标准:

Criteria<Employee> criteria = session.CreateCriteria<Employee>();

可用使用建立的标准进行实体的获取操作,获取结果可以是普通 List 或 EntityList 或 EntityDataTable。

List<Employee> employeeList = criteria.RetrieveGeneralList();
EntityList
<Employee> employeeEntityList = criteria.RetrieveList();
EntityDataTable
<Employee> employees = criteria.RetriveDataTable();

以上三个获取方法都提供了获取部分数据(即从指定的索引起最大获取 N 个实体)的重载,适用于数据分页等应用场景。但在符合标准的数量特别大或对性能要求比较高时应采用其他更加高效的获取方式。

4.6.1为标准添加条件
可以使用 Criteria 提供的一系列添加条件的方法对标准进行进一步的规定,如以下代码将建立一个名字等于 Mike 的标准:

criteria = criteria.AddEqualTo(Employee.NAME, "Mike");

更多类型的条件参见帮助文档。

小技巧:建立标准及添加条件、获取数据是可以连写的,连写方式可以减少代码量并使代码更加清晰,如以上代码可以连写为:

List<Employee> employeeList = session.CreateCriteria<Employee>()
    .AddEqualTo(Employee.NAME, 
"Mike")
    .RetrieveGeneralList();

4.6.2惰性加载
使用 EntityList 作为标准的的获取结果时可以使用 PL 的惰性加载特性,即执行获取操作时只获取实体的主键属性,而对其他数据“随用随取”。数量大时惰性加载可以显著提高应用程序的性能并降低内存占用。使用惰性加载时应使用 RetriveList 方法的以下重载:

EntityList<Employee> employeeList = criteria.RetrieveList(true);

惰性加载是用户是完全透明的,除在获取实体列表时指明采用惰性加载外,不需要做任何额外的处理,PL 总会在客户程序需要的时候自动完成加载并对加载的数据进行缓存。

4.6.3按照标准进行其他操作
按照标准进行的其他操作包括 Update(更新)、Delete(删除)、Count(统计)、Exists(是否存在,当然可以用 Count 完成该功能,但 Exists 提供了更高效的方法)。
使用 Update 方法可以将符合标准的所有实体的指定属性更新为目标值,如以下代码可以将所有 10 岁的员工的年龄更新为 11:

session.CreateCriteria<Employee>().AddEqualTo(Employee.AGE, 10).Update(Employee.AGE, 11);

也可以使用 Action 委托进行更加灵活的更新,如以下代码将所有员工的年龄加1:

session.CreateCriteria<Employee>()
    .Update(
delegate(Employee em) if (em.Age.HasValue) em.Age = em.Age + 1; });

建议:充分利用 C#2.0 的匿名委托可以使代码更加简洁。
小技巧:可以利用标准的 Update 命令实现主键属性值的更改。如以下代码可以将 Id 为 1 的员工的 Id 改为 2:

session.CreateCriteria<Employee>()
    .AddEqualTo(Employee.ID_, 
1)
    .Update(Employee.ID_, 
2);

4.7 Session 的状态
Session 与 ADO.NET 中的 Connection 存在一定的对应关系,因此 Session 也具有“打开”及“关闭”状态。可以用 Open 方法打开 Session 或用 Close 方法关闭 Session ,可以用 IsOpen 属性查看 Session 是否已经打开。
Session 在执行实际操作(如获取或保存数据等)时如果是关闭的,Session 会自动打开并在执行完操作后自动关闭。因此可以在不显式执行 Open 时使用 Session 进行各种操作。
Session 保持长时间打开或者频繁的打开、关闭都可能会对应用程序的性能产生一定的影响,因此建议在对数据进行频繁操作前应手动调用 Open 并一定要完成操作后调用 Close,反之则没必要显式调用。

4.8 事务
如果一组操作要求做到要么全部完成、要么一个也不做,则应该使用事务,Session 的三个方法 BeginTransaction、TransactionCommit、TransactionRollback 分别用于开始事务、提交事务、回滚事务。以下代码是事务的典型应用:

session.BeginTransaction();
try
{
    session.Update(employee1);
    session.Update(employee2);
    session.TransactionCommit();
}

catch
{
    session.TransactionRollback();
    
throw;
}

posted @ 2008-04-22 17:04  同一片海  阅读(631)  评论(0编辑  收藏  举报