Silverlight RIA Service开发实战总结(一)
Silverlight RIA Service开发实战总结(一)
如何更新(新增实体)domainService和metadata class
第一次使用向导生成linq-to-sql data model或ado.net entity data model后创建domain service以及metadata class都有向导很方便的生成对应的代码,但在开发过程中难免会新增个表或字段的,虽然linq-to-sql,ado.net entity提供在设计视图同步更新数据结构,但domain service,metadata class却没有提供同步更新的方法,每次只能新增新的或覆盖以前的文件,而自己写代码势必会增加不少工作量和一些bug;
下面说一下我的解决方法:
第一次根据向导生成各自的类文件,然后修改domain service类和metadata类,类似代码如下
{
……
}
然后将你自己扩展的方法写在另外一个同名的domainservice类,方便日后修改定位
第二次新增实体后可以再次通过向导生成一个新domainservice类和metadata类,生成完后同样将类名修改成一样加上 partial 关键字
如此不会影响你修改过的类文件,实现了很好扩展。
如何有效地调用带参数的方法
向导产生的domainservice类的查询方法不带参数,而实际情况肯定需要根据条件筛选数据,比如一下代码
Domain service 类的代码

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的方法都是异步调用,只有成功回调后才能得到结果
一般的调用方法如下
this.codeListCollection = db.CodeListItems;
db.Load(db.GetCodeListQuery());
以上代码在有些场合并不能用,因为执行完db.load方法后db.CodeListItems并没有得到结果,还不能马上用
下面是完成异步调用代码

{
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种写法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2006-06-18 设计模式之策略模式(Strategy)