zoukankan      html  css  js  c++  java
  • ADO.NET EF 中的实体修改方法

     http://www.cnblogs.com/zfz15011/archive/2010/05/30/1747486.html

    1.传统修改模式,看下列代码

    using (NorthwindEntities context = new NorthwindEntities())
    {
        Region region 
    = context.Region.FirstOrDefault(v => v.RegionID == 4);
        region.RegionDescription 
    = "Test";
        context.SaveChanges();
    }

    监控SQL语句:

     

    SQL1:SELECT TOP 1 [Extent1].[RegionID] AS [RegionID][Extent1].[RegionDescription] AS [RegionDescription]FROM [dbo].[Region] AS [Extent1]WHERE 4 = [Extent1].[RegionID]
    SQL2:
    exec sp_executesql N'update [dbo].[Region]set [RegionDescription] = @0where ([RegionID] = @1)', N'@0 nchar(4),@1 int'@0 = N'Test'@1 = 4

     从这里例子中可以看出使用“传统模式”的数据更新,必须先要执行一次查询,将获取要更新的实体对象,在看下面的例子:

    复制代码
    Region region;
    using (NorthwindEntities context = new NorthwindEntities())
    {
        region 
    = context.Region.FirstOrDefault(v => v.RegionID == 4);
    }
    using (NorthwindEntities context = new NorthwindEntities())
    {
        region.RegionDescription 
    = "Test";
        context.SaveChanges();
    }
    复制代码

    更新是不会执行的,因为实体不再 执行 SaveChanges 的对象中所以 当我们更新一个 不再当前连接中的对象是必须要先执行查询获取这个对象才能对其更新,如下:

    复制代码
    Region region;
    using (NorthwindEntities context = new NorthwindEntities())
    {
        region 
    = context.Region.FirstOrDefault(v => v.RegionID == 4);
    }
    using (NorthwindEntities context = new NorthwindEntities())
    {
        Region newRegion 
    = context.Region.FirstOrDefault(v => v.RegionID == region.RegionID);
        region.RegionDescription 
    = "Test";
        context.SaveChanges();
    }
    复制代码

     

     

    2.使用ApplyPropertyChanges 修改实体

    复制代码
    Region region;
    using (NorthwindEntities ne = new NorthwindEntities())
    {
        
    //利用EntityObject.Execute(MergeOption.NoTracking),等效于使用ObjectContext.Dettach(EntityObject)
        
    //查询并分离对象
        region = ne.Region.Execute(MergeOption.NoTracking).Where(v => v.RegionID == 1).FirstOrDefault();
    }
    //修改分离的值
    region.RegionDescription = "TestTest1";
    //使用分离的对象 order 更新 
    using (NorthwindEntities context = new NorthwindEntities())
    {
        
    //将数据载入到context中以便更新
        context.GetObjectByKey(region.EntityKey);
        
    //使用order 更新 context中的对应对象
        context.ApplyPropertyChanges(region.EntityKey.EntitySetName, region);
        context.SaveChanges();
    }
    复制代码

    监控SQL语句:

     

    SQL1:exec sp_executesql N'SELECT [Extent1].[RegionID] AS [RegionID], [Extent1].[RegionDescription] AS [RegionDescription] FROM [dbo].[Region] AS [Extent1] WHERE [Extent1].[RegionID] = @p0', N'@p0 int'@p0 = 1
    SQL2:
    exec sp_executesql N'update [dbo].[Region] set [RegionDescription] = @0where ([RegionID] = @1) ', N'@0 nchar(9),@1 int'@0 = N'TestTest1'@1 = 1

     

    ApplyPropertyChanges在MSDN的解释是“将已分离对象的属性更改应用于已附加到对象上下文的对象。”其实说白了就是 拿旧对象去更新新对象,我们可以看出 使用“ApplyPropertyChanges 修改实体”方法修改实体与 使用“传统模式”是一样的,都是必须先执行一次查询,获取更新的对象,但是 ApplyPropertyChanges方法的特殊之处是,该方法会拿内存中的对象(新对象)和当前连接中的对象(旧对象)对比,自动生成对应字段修改的Update语句,如果内存中的对象与当前连接中的对象完全相等(每个字段的值都相等),将不生成响应的Update。当我们再次执行 上述代码观察监控到了SQL语句,你会发现只监控到SQL1,不会得到SQL2。

     

    3.使用Attach与SetModifiedProperty修改实体

    复制代码
    using (NorthwindEntities context = new NorthwindEntities())
    {
        Region region 
    = context.Region.FirstOrDefault(v => v.RegionID == 4);
        context.Detach(region);
        region.RegionDescription 
    = "因为测试";

        context.Attach(region);
        var newRegion 
    = context.ObjectStateManager.GetObjectStateEntry(region);
        newRegion.SetModified();
        newRegion.SetModifiedProperty(
    "RegionDescription");

        context.SaveChanges();
    }
    复制代码

     监视SQL语句:

    exec sp_executesql N'update [dbo].[Region]set [RegionDescription] = @0where ([RegionID] = @1)', N'@0 nchar(4),@1 int'@0 = N'因为测试'@1 = 4

    使用该方法,可以将不再当前连接集合中的实体使用Attach方法加入到当前集合中 在使用 SetModifiedProperty 来设置修改字段,使用该方法不必再执行查询将数据读入当前连接对象才能修改

  • 相关阅读:
    HDU 4539郑厂长系列故事――排兵布阵(状压DP)
    HDU 2196Computer(树形DP)
    HDU 4284Travel(状压DP)
    HDU 1520Anniversary party(树型DP)
    HDU 3920Clear All of Them I(状压DP)
    HDU 3853LOOPS(简单概率DP)
    UVA 11983 Weird Advertisement(线段树求矩形并的面积)
    POJ 2886Who Gets the Most Candies?(线段树)
    POJ 2828Buy Tickets
    HDU 1394Minimum Inversion Number(线段树)
  • 原文地址:https://www.cnblogs.com/baozhu/p/4378889.html
Copyright © 2011-2022 走看看