[AX]AX2012开发新特性UnitOfWork

类UnitOfWork用来管理数据库事务,它成功处理所有保存在表变量的纪录,或者拒绝所有的更新,这个类还可以自动管理外键关联表的删除、插入和更新顺序,自动将主表主键值填入相应的外键列。UnitOfWork不能象delete_from那样处理where选择的批纪录,只能操作给定的行。典型的用法:

server static public void tryUnitOfWork()
{
    Table1 table1;
    Table2 table2;
    UnitofWork  uow=new UnitofWork();
    ;
    delete_from table1;
    delete_from table2;
    table1.ID="xx1";
    table1.ValidFrom=today();
    table1.ValidTo=today()+10;
    table2.Field1="table2field1";
    table2.masterTable1(table1);

    uow.insertonSaveChanges(table1);
    uow.insertonSaveChanges(table2);
    uow.saveChanges();
}

首先这个UnitOfWork必须是在服务器上运行,所以这里方法被定义为static并加上server关键字,因此这个方法不能使用Job,这里是一个类的静态方法。

表table2的Table1Fk字段用于容纳table1的recid,这是在table2的relations新建一个foreign key的关系时自动创建的,注意表table2的masterTable1方法,这也是设置foreign key的关系时自动创建的,方法名来自于relation的属性RelatedTableRole,同时必须把relation的CreateNavigationPropertyMethods设置为Yes。

UnitOfWork要求使用乐观(optimistic)并发控制,如果任何表变量使用了pessimistic并发控制,saveChanges会抛出错误。所有表都有一个OccEnabled属性,默认为yes,表示启用Optimistic并发控制,可以使用concurrencyModel 方法使用oncurrencyModel::Optimistic临时设置为乐观并发控制。新插入的纪录在select时也要使用optimisticLock 关键字,以防纪录死锁。

UnitOfWork内部使用数据库事务来处理数据更新,如果任何一个更改被拒绝,所有的更新被回滚保持数据以前的状态,同时表变量也被回滚,如果表变量使用insertonSaveChanges更新表变量会被重新初始化为null,如果用的updateOnSaveChanges表变量保持以前的值。

使用UnitOfWork的一个原则是尽量保持事务小规模,比如多次调用saveChanges提交更改,而不是在很多很多的insertonSaveChanges之后才saveChanges,因为大事务需要锁定更多的资源,容易造成死锁,当然也不是说每次insertonSaveChanges之后就调用saveChanges,这又会影响到性能的。

另外UnitOfWork也是首纪录级权限RLS控制的,UnitOfWork不能用于操作临时表。

更多信息查阅http://msdn.microsoft.com/en-us/library/gg846338.aspx

原文地址:https://www.cnblogs.com/duanshuiliu/p/2637410.html