Silverlight RIA Service开发实战总结(一)

Silverlight RIA Service开发实战总结(一)

 

如何更新(新增实体)domainService和metadata class

 

第一次使用向导生成linq-to-sql data modelado.net entity data model后创建domain service以及metadata class都有向导很方便的生成对应的代码,但在开发过程中难免会新增个表或字段的,虽然linq-to-sql,ado.net entity提供在设计视图同步更新数据结构,但domain servicemetadata class却没有提供同步更新的方法,每次只能新增新的或覆盖以前的文件,而自己写代码势必会增加不少工作量和一些bug

下面说一下我的解决方法:

第一次根据向导生成各自的类文件,然后修改domain service类和metadata类,类似代码如下

 

public   partial   class  EMSDomainService : LinqToEntitiesDomainService < EQPEntities >
    { 

        …… 


 

 

然后将你自己扩展的方法写在另外一个同名的domainservice类,方便日后修改定位

第二次新增实体后可以再次通过向导生成一个新domainservice类和metadata类,生成完后同样将类名修改成一样加上 partial 关键字

如此不会影响你修改过的类文件,实现了很好扩展。

如何有效地调用带参数的方法

 

向导产生的domainservice类的查询方法不带参数,而实际情况肯定需要根据条件筛选数据,比如一下代码

Domain service 类的代码

 

ExpandedBlockStart.gif 代码
[Query(IsDefault  =   false , ResultLimit  =   50 )]
        
public  IQueryable < PRE_EMS3_EQU >  GetPRE_EMS3_EQUByPrefix( string  copemsNo,  string  tradeCode,  string  prefix)
        {
            
if  ( this .isCode(prefix))
            {
                
int  no  =  System.Convert.ToInt32(prefix);
                var query 
=  from item  in   this .ObjectContext.PRE_EMS3_EQU
                            
where  item.TRADE_CODE.Equals(tradeCode)  &&
                            item.COP_EMS_NO.Equals(copemsNo) 
&&
                            (item.G_NO.Equals(no) 
||  item.CODE_T_S.StartsWith(prefix))
                            select item;

                
return  query;
            }
            
else
            {
                var query 
=  from item  in   this .ObjectContext.PRE_EMS3_EQU
                            
where  item.TRADE_CODE.Equals(tradeCode)  &&
                            item.COP_EMS_NO.Equals(copemsNo) 
&&
                            item.G_NAME.Contains(prefix)
                            select item;

                
return  query;
            }

        } 

 

 

 

对应DomainContext类的代码,

说明:所有页面(xaml)调用DomainContext的方法都是异步调用,只有成功回调后才能得到结果

一般的调用方法如下

            

CodeListDomainContext  db  =   new  CodeListDomainContext();
            
this .codeListCollection  =  db.CodeListItems;
            db.Load(db.GetCodeListQuery()); 

 

 

以上代码在有些场合并不能用,因为执行完db.load方法后db.CodeListItems并没有得到结果,还不能马上用

下面是完成异步调用代码

 

ExpandedBlockStart.gif 代码
if  (db2  ==   null )
            {
                db2 
=   new  EMSDomainContext();
            }
            
#region  query callback
            
/*
            db2.Load(db2.GetPRE_EMS3_ORG_IMGByPKQuery(this.TradeCode,this.CopEmsNo,this.CopImgNo),
                     loadOperation =>
                     {
                         loadOperation.Completed += (s, e) =>
                             {
                                 var e1= loadOperation.Entities;
                                 if (e1.Count() > 0)
                                 {
                                     Console.WriteLine(e1.First());
                                 }
                             };
                     }, null);
            
*/
            
#endregion


            
#region  query.completed
            
if  ( this .CopImgNo  ==   this .CopImgNoComboBox.Text  &&   ! string .IsNullOrEmpty( this .Unit))
                
return ;
            var query 
=  db2.Load(db2.GetPRE_EMS3_ORG_EXGByPKQuery( this .TradeCode,  this .CopEmsNo,  this .CopImgNo));
            query.Completed 
+= (s,e) =>
                {
                    PRE_EMS3_ORG_EXG item 
=   null ;
                    LoadOperation
< PRE_EMS3_ORG_EXG >  q  =  (LoadOperation < PRE_EMS3_ORG_EXG > )s;
                  
if  (q.Entities.Count()  >   0 )
                  {

                      item 
=  q.Entities.First();
                  }
                  
if  (item  !=   null )
                  {
                      
this .CopImgNo  =  item.COP_G_NO;
                  }
                  
else
                  {
                      
this .CopImgNo  =   "" ;
                 }
                };
            
#endregion  

 

 

以上提供2种写法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值