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();
             }
      }

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

原文地址:https://www.cnblogs.com/flyinghigher/p/2482879.html