zoukankan      html  css  js  c++  java
  • 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+=..

  • 相关阅读:
    C#多线程下更新UI的几种方法
    .net WebApi使用swagger 美化接口文档
    C#内存管理
    LINQ 推迟查询的执行
    C#多播委托详解
    泛型委托
    使用 ref 和 out 传递数组注意事项
    何时使用委托而不使用接口
    委托中的协变和逆变
    细说SQL Server数据类型
  • 原文地址:https://www.cnblogs.com/yangfan/p/1626608.html
Copyright © 2011-2022 走看看