现在的位置: 首页 > 综合 > 正文

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

2011年04月07日 ⁄ 综合 ⁄ 共 3653字 ⁄ 字号 评论关闭

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 类的代码

 

代码

[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并没有得到结果,还不能马上用

下面是完成异步调用代码

 

代码

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种写法

 

抱歉!评论已关闭.