zoukankan      html  css  js  c++  java
  • 01-Entity FrameWork如何控制数据的变化

    在Entity Framework所有操作数据就是更新EF容器中的实体状态

     public enum EntityState
        {
            Added = 4,
            Deleted = 8,
            Detached = 1,
            Modified = 0x10,
            Unchanged = 2
        }

     1、新增

        StudentAddress address = new StudentAddress
                {
                    Address = "地址" + DateTime.Now
                };
                db.StudentAddress.Add(address);
                Console.WriteLine(db.Entry<StudentAddress>(address).State);//added
                db.SaveChanges();

    调用Add方法,实际上就是将实体状态改为added,然后通过saveChanges()保存到数据库

      StudentAddress address = new StudentAddress
                {
                    Address = "地址" + DateTime.Now
                };
    
                db.Entry<StudentAddress>(address).State = System.Data.Entity.EntityState.Added;
                db.SaveChanges();

    2、编辑

      --第一种方法:

                var address2 = db.StudentAddress.FirstOrDefault();
                address2.Address = "ModifyFromEf2";//Modified 
                db.SaveChanges();

    -- 1、与实体字段的值作比较,如果值不变,则不会产生update-sql语句
    -- 2、修改了某个字段值,update sql语句只会set 修改某个字段,不会修改全部字段
    -- 3、查询2次数据库

    --第二种方法:

       StudentAddress address = new StudentAddress
                {
                    Id = 36,
                    Address = "update地址"
                };
    
                //1、追加到EF容器中,状态为Detached
                var entityEntry = db.Entry(address);//Detached 
                entityEntry.State = System.Data.Entity.EntityState.Modified;
                db.SaveChanges();

     --1、将一个游离的实体 追加到 EF 容器中 

    -- 2、将EF实体状态改为Modified

    -- 3、修改所有的字段,无论是否变化

     

    --第三种方法(综合前两种修改方法):

      --查询1次数据库

      --修改指定的字段

       //1、追加到EF容器中,状态为Detached
                var entityEntry = db.Entry(address);//Detached
                Console.WriteLine("追加到EF容器:" + entityEntry.State);
    
                //2、修改指定字段Unchanged-->指定字段为修改
                db.StudentAddress.Attach(address);//相当于entry.State = System.Data.EntityState.Unchanged;   
                Console.WriteLine("Attach-Unchanged:" + entityEntry.State); //Unchanged  
    
                entityEntry.Property("Address").IsModified = true;
                Console.WriteLine("修改后状态:" + entityEntry.State); //Modified 
    
                db.SaveChanges();

    3、删除亦是如此

          StudentAddress address = new StudentAddress
                {
                    Id = 36,
                    Address = "u222pdate地址" + DateTime.Now
                };
                db.StudentAddress.Attach(address);//Detached
          
                db.StudentAddress.Remove(address);//或将其状态修改为:EntityState.Deleted;
                db.SaveChanges();

    4、源码

      --每一种数据的变化,都会有相应的集合来保存这些实体的变化

        如:ObjectStateManager 

    Dictionary<EntityKey, EntityEntry> _addedEntityStore
    Dictionary<EntityKey, EntityEntry> _deletedEntityStore
    Dictionary<EntityKey, EntityEntry> _unchangedEntityStore
    Dictionary<EntityKey, EntityEntry> _modifiedEntityStore

      --当实体变化发生改变时候,调用AddEntityEntryToDictionary,插入到集合中

     

        --调用saveChange(),就会去获取这些变化,进行操作数据

  • 相关阅读:
    Your branch and 'origin/master' have diverged, and have # and # different commits each, respectively
    testng dataprovider 的几种用法以及Java中的二维数组
    python 类属性 实例属性 类方法 实例方法 静态方法(转载)
    Webdriver中PageFactory的正确用法
    Selenium webdriver在最开始打开的时候浏览器的地址栏会出现data的解决方法
    Selenium webdriver如何处理confirm对话框的问题
    SoapUI 引用第三方jar包和引用Groovy脚本
    git rebase -i 合并commit
    Git 撤销commit的注意事项
    单进程执行
  • 原文地址:https://www.cnblogs.com/zjflove/p/6127006.html
Copyright © 2011-2022 走看看