LinqToEntities 更新、删除 的小技巧 Attach 和 域操作自定义方法

环境: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+=..

原文地址:https://www.cnblogs.com/yangfan/p/1626608.html