• EF4.0自跟踪实体使用小结


          鉴于英文不好,英文的文献读起来实在吃力,于是一些概念不是十分理解,诸如:上下文与实体视图的关系等理解不很深入。自己做的简单的增删改的例子,记录下来,以强化理解。

    1、采用的是DBFirst的建模方式,
    数据表结构如下:


    CREATE TABLE [dbo].[登记件表](
     [登记编号] [nvarchar](50) NOT NULL PK,
     [批号] [nvarchar](50) NULL)

    CREATE TABLE [dbo].[查封表](
     [登记编号] [nvarchar](50) NOT NULL PK FK,
     [文件] [nvarchar](50) NULL,
     [文号] [nvarchar](50) NULL)

    2、新增
    2.1新增一个主表记录
     using (MyEntities entiry = new MyEntities())
          {      
                Ent登记件 ent登记件 = new Ent登记件();           //这里会自动将ent登记件的状态置为Added,所以不需要AddTo**s方法或者AddObject方法
                ent登记件.登记编号 = "001";

                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
       ent登记件.AcceptChanges();
          }
    或者
     Ent登记件 ent登记件 = null ;
     using (MyEntities entiry = new MyEntities())
          {      
                Ent登记件 ent登记件 = new Ent登记件();
                ent登记件.登记编号 = "001";
          }

     using (MyEntities entiry = new MyEntities())
          { 
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
       ent登记件.AcceptChanges();
          }

    说明:这里两种新增方式的不同,是使用同一个contex和不同contex的区别
    2.2新增一个主表和一个从表记录
    using (MyEntities entiry = new MyEntities())
          {      
                Ent登记件 ent登记件 = new Ent登记件();
                ent登记件.登记编号 = "001";

                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
          if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
      if(ent登记件.查封!=null)
          ent登记件.查封.AcceptChanges();
                 }
          }
    或者
     Ent登记件 ent登记件 = null ;
     using (MyEntities entiry = new MyEntities())
          {      
                Ent登记件 ent登记件 = new Ent登记件();
                ent登记件.登记编号 = "001";

                Ent查封 ent查封 = new Ent查封();
                ent查封.查封文号 = "111";

                ent登记件.查封 = ent查封;
          }

     using (MyEntities entiry = new MyEntities())
          { 
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
      if(ent登记件.查封!=null)
          ent登记件.查封.AcceptChanges();
                 }
          }

    3、修改
    3.1修改主表记录
     using (MyEntities entiry = new MyEntities())
          {      
                  Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
                  //ent登记件.StartTracking();   //该语句可有可无
          ent登记件.批号 = "123";    //这里会将ent登记件的状态由Unchanged修改为Modified
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
       ent登记件.AcceptChanges();
          }
    或者
     Ent登记件 ent登记件 = null ;
     using (MyEntities entiry = new MyEntities())
          {      
                 Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
                 ent登记件.StartTracking();   //该语句不可缺少,用于开启状态跟踪
           ent登记件.批号 = "123";    //这里会将ent登记件的状态由Unchanged修改为Modified
          }

     using (MyEntities entiry = new MyEntities())
          { 
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
                 }
          }
    3.2修改从表记录
     using (MyEntities entiry = new MyEntities())
          {      
                  Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
                  //ent登记件.StartTracking();
                  entity.LoadProperty(ent登记件, c => c.查封);
                  //ent登记件.查封.StartTracking();
                  ent登记件.查封.文号 = "张三";
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
      if(ent登记件.查封!=null)
          ent登记件.查封.AcceptChanges();
                 }
          }
    或者
     Ent登记件 ent登记件 = null ;
     using (MyEntities entiry = new MyEntities())
          {      
                 Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
                  ent登记件.StartTracking();
                  entity.LoadProperty(ent登记件, c => c.查封);
                  ent登记件.查封.StartTracking();
                  ent登记件.查封.文号 = "张三";
          }

     using (MyEntities entiry = new MyEntities())
          { 
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
      if(ent登记件.查封!=null)
          ent登记件.查封.AcceptChanges();
                 }
          }
    3、删除
    3.1删除主表记录
    错误用法:
    using (MyEntities entiry = new MyEntities())
          {      
                  Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
          ent登记件.MarkAsDeleted();    //这里会将ent登记件的状态由Unchanged修改为Deleted,该语句可以自动打开ent登记件.StartTracking();
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
       ent登记件.AcceptChanges();
          }
    该方法删除记录时,没有发现不妥的地方,但是saveChanges值始终为0,也就是说数据库中的记录并没有真的删除,具体原因不详,如有知道的朋友请赐教。
    以下为正确用法:
     Ent登记件 ent登记件 = null ;
     using (MyEntities entiry = new MyEntities())
          {      
                 Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
          }

     using (MyEntities entiry = new MyEntities())
          { 
          ent登记件.MarkAsDeleted();
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
                 }
          }
    3.2删除从表记录
    using (MyEntities entiry = new MyEntities())
          {      
                  Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
                  entity.LoadProperty(ent登记件, c => c.查封);
                  ent登记件.查封.MarkAsDeleted();
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
      if(ent登记件.查封!=null)
          ent登记件.查封.AcceptChanges();
                 }
          }
    或者
     Ent登记件 ent登记件 = null ;
     using (MyEntities entiry = new MyEntities())
          {      
                 Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
                  entity.LoadProperty(ent登记件, c => c.查封);
          }

     using (MyEntities entiry = new MyEntities())
          { 
          ent登记件.查封.MarkAsDeleted();
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
      if(ent登记件.查封!=null)
          ent登记件.查封.AcceptChanges();
                 }
          }
    删除主表记录和它对应的所有从表记录
     Ent登记件 ent登记件 = null ;
     using (MyEntities entiry = new MyEntities())
          {      
                 Ent登记件 ent登记件 = entiry.Ent登记件集.Where(ent => ent.登记编号 == "001").FirstOrDefault();
                  entity.LoadProperty(ent登记件, c => c.查封);
          }

     using (MyEntities entiry = new MyEntities())
          { 
          ent登记件.MarkAsDeleted();
                 entiry.Ent登记件集.ApplyChanges(ent登记件);
                 int saveChanges = entiry.SaveChanges(); 
                 if( saveChanges > 0 )
          {
       ent登记件.AcceptChanges();
      if(ent登记件.查封!=null)
          ent登记件.查封.AcceptChanges();
                 }
          }

    总结:这里对常用的增删改进行了列举,当然其它的用法还有很多,另外查询的方法这里也有涉及,以后有新的用法再具体补充。

  • 相关阅读:
    Swift
    Swift
    Swift
    Mac
    Mac
    Sqlite数据库 找不到请求的 .Net Framework Data Provider。可能没有安装
    Couchbase的web管理员后台 查看缓存提示警告 Warning: Editing of document with size more than 2.5kb is not allowed的解决方法
    转:asmx迷10分钟升级成wcf熟手指南
    .net4.0下 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误
    Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式
  • 原文地址:https://www.cnblogs.com/flyinghigher/p/2482879.html
Copyright © 2020-2023  润新知