如何在XPO中为非主键字段获取Int型自增量

数据库中的一条记录,除了应有自己的唯一切不包含任何逻辑意义的主键外,常常也需要一些暴露给最终用户的,User-Friendly的唯一编号。

 

例如用户、订单之类的对象,除了自己有一个可能是GUID类型的主键以外,常常还会有一个Int型的编号“用户编号”,“订单号码”。

 

如果直接操作数据库,例如SQL SERVER,这是很容易的,只需要将字段设成Identity即可获得一个自增量。

 

但是在XPO中,只有作为KEY(主键)的字段才有AutoGenerate属性,其他非KEY的字段都没有。同时,XPO又限定一个对象只能有一个KEY字段。(实际上System.Data.SqlClient也是不支持的)

 

那如何获取一个自增量?只能靠自己动手了。

 

DevExpress的Support Center中提供了一段Sample:

http://www.devexpress.com/Support/Center/p/CQ22273.aspx

 

例子中的代码稍显复杂,偶将其简化如下:

ExpandedBlockStart.gif XpoSequencer
 1       public   sealed   class  XpoSequencer : XPBaseObject
 2      {
 3          [Key( true )]
 4           public  Guid Oid;
 5          [Size( 254 ), Indexed(Unique  =   true )]
 6           public   string  SequenceId;
 7           public   int  Counter;
 8           public  XpoSequencer(Session session) :  base (session) { }
 9           public   const   int  MaxIdGenerationAttempts  =   7 ;
10           public   const   int  MinConflictDelay  =   50 ;
11           public   const   int  MaxConflictDelay  =   500 ;
12 
13           public   static   int  GetNextValue(IDataLayer dataLayer,  string  sequenceId)
14          {
15               if  (dataLayer  ==   null )
16                   throw   new  ArgumentNullException( " dataLayer " );
17               if  (sequenceId  ==   null )
18                  sequenceId  =   string .Empty;
19               for  ( int  attempt  =   1 ; ;  ++ attempt)
20              {
21                   try
22                  {
23                       using  (Session generatorSession  =   new  Session(dataLayer))
24                      {
25                          XpoSequencer generator  =  generatorSession.FindObject < XpoSequencer > ( new  OperandProperty( " SequenceId " ==  sequenceId);
26                           if  (generator  ==   null )
27                          {
28                              generator  =   new  XpoSequencer(generatorSession);
29                              generator.SequenceId  =  sequenceId;
30                          }
31                          generator.Counter ++ ;
32                          generator.Save();
33                           return  generator.Counter;
34                      }
35                  }
36                   catch  (LockingException)
37                  {
38                       if  (attempt  >=  MaxIdGenerationAttempts)
39                           throw ;
40                  }
41                   if  (attempt  >  MaxIdGenerationAttempts  /   2 )
42                      Thread.Sleep( new  Random().Next(MinConflictDelay, MaxConflictDelay));
43              }
44          }
45      }

 

 

只需要上面这个XpoSequencer类即可,例子中的XpoSiteId类偶没用。

 

XpoSequencer 类的使用方法也很简单,例如在Order类中需要获取一个自增订单号:

         static   readonly   string  typeName  =   typeof (XpoOrder).FullName;

        
int  GetMaxID()
        {
            
return  ( int )XpoSequencer.GetNextValue(Session.DataLayer, typeName);
        }

 

 

注意上面的typeName字符串,它代表了要获取自增量对象的唯一标识。在XpoSequencer中会对每一个唯一标识添加一条记录,自增量是按该记录中的值来算的。在一个项目中就可以用XpoSequencer为多个对象产生各自独立的自增量。例如换到User要用时,传入typeof(XpoUser).FullName即可。也可以用其他的任意字符串,只要能唯一的标识出不同的自增量就可以。

 

转载于:https://www.cnblogs.com/Elvin/archive/2010/07/01/1769424.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
疫情居家办公系统管理系统按照操作体分为管理员和用户。管理员的功能包括办公设备管理、部门信息管理、字典管理、公告信息管理、请假信息管理、签到信息管理、留言管理、外出报备管理、薪资管理、用户管理、公司资料管理、管理员管理。用户的功能等。该系统采用了MySQL数据库,Java语言,Spring Boot框架等技术进行编程实现。 疫情居家办公系统管理系统可以提高疫情居家办公系统信息管理问题的解决效率,优化疫情居家办公系统信息处理流程,保证疫情居家办公系统信息数据的安全,它是一个常可靠,常安全的应用程序。 管理员权限操作的功能包括管理公告,管理疫情居家办公系统信息,包括外出报备管理,培训管理,签到管理,薪资管理等,可以管理公告。 外出报备管理界面,管理员在外出报备管理界面可以对界面显示,可以对外出报备信息的外出报备状态进行查看,可以添加新的外出报备信息等。签到管理界面,管理员在签到管理界面查看签到种类信息,签到描述信息,新增签到信息等。公告管理界面,管理员在公告管理界面新增公告,可以删除公告。公告类管理界面,管理员在公告类管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值