环境:VS2008,Silverlight3
DomainSevice让我们大部分情况不需要再写更新、删除的代码
不过有些情况似乎不太好使,比如 我希望通过 Key 值去更新或删除一笔记录
Silverlight端是对Entity的操作,并根据Entity 是 新增、修改或移除,通过 SubmitChanges() 触发 DomainSevice 调用相应的Insert、Update、Delete操作,当Entity已经Load到DomainContext,这种操作非常方便,逻辑也很清楚
可是假如碰到这样的例子,比如Gmail的标签,一般的设计,这里会有三个表 信件,标签Master(存放标签信息,这里会有不同类型的标签,可能不是邮件的标签),标签Detail(这里存放的是哪封信或其他资料属于哪个标签)
加载资料时,信件和标签Master需加载,标签Detail是不需加载的,此时若要移除某封信件的某个标签,问题就来了,你需要先 Load 到Silverlight端,移除,然后SubmitChanges()
再比如网站的统计,希望的只是更新统计信息,也不需要Load
我用Attach 和 域操作自定义方法 来解决这些问题,希望对有需要的人有帮助,也希望知道更好方法的兄弟分享你的方法
方法1 Attach
Web端不更改,代码写在Silverlight端
删除:
TagContext xTagContext=new TagContext();
TagDetail xTagDetail=new TagDetail(){UniID="这里是Key值"};必须初始化要删除资料 的主键,有规律的主键会很方便
xTagContext.TagDetails.Attach(xTagDetail);
xTagContext.TagDetails.Remove(xTagDetail);
xTagContext.SubmitChanges();
更新:
TagContext xTagContext=new TagContext();
TagDetail xTagDetail=new TagDetail(){UniID="这里是Key值"};必须初始化要更新资料 的主键
xTagContext.TagDetails.Attach(xTagDetail);
xTagDetail. ...=... //更新方法,写在Attach后
xTagContext.SubmitChanges();
方法2 自定义域操作方法
DomainService 方法须符合约定,才可生成在 Silverlight 端的DomainContext
删除:
DomainService写自定义方法
[EnableClientAccess()]
public class TagService : LinqToEntitiesDomainService<SMBSYSEntities>
{
//在对应的DomainService写自定义方法
//这里有两点要注意 1.方法名不能以Delete、Remove开头
//2.参数类型,须是 T:Entity(继承Entity的类型) 或 string,int这些基本类型(哈哈,其实这里我也没太搞清楚类型的约定,只是尝试)
public void DelTagDetail(string UniID) //参数可以根据需要修改
{
//这里就可以自己写处理的方法了,用 传统的sql,用Linq 都可以 (这里还用Attach来写)
TagDetail xTagDetail=new TagDetail(){UniID=UniID};必须初始化要删除资料 的主键,有规律的主键会很方便
this.ObjectContext.Attach(xTagDetail);
this.ObjectContext.DeleteObject(xTagDetail);
this.ObjectContext.SaveChanges();
}
}
Silverlight端调用:
TagContext xTagContext=new TagContext();
InvokeOperation io= xTagContext.DelTagDetail("传入参数");
io.Completed+=..
更新:
DomainService写自定义方法
[EnableClientAccess()]
public class TagService : LinqToEntitiesDomainService<SMBSYSEntities>
{
//在对应的DomainService写自定义方法
//这里有两点要注意 1.方法名不能以Update,Change,Modify开头
//2.参数类型,须是 T:Entity(继承Entity的类型) 或 string,int这些基本类型(哈哈,其实这里我也没太搞清楚类型的约定,只是尝试)
public void UptTagDetail(string UniID) //参数可以根据需要修改
{
//这里就可以自己写处理的方法了,用 传统的sql,用Linq 都可以 (这里还用Attach来写)
TagDetail xTagDetail=new TagDetail(){UniID=UniID};必须初始化要更新资料 的主键,有规律的主键会很方便
this.ObjectContext.Attach(xTagDetail);
xTagDetail. ...=...//更新内容
this.ObjectContext.SaveChanges();
}
}
Silverlight端调用:
TagContext xTagContext=new TagContext();
InvokeOperation io= xTagContext.UptTagDetail("传入参数");
io.Completed+=..