01-Entity FrameWork如何控制數據的變化

在Entity Framework全部操做數據就是更新EF容器中的實體狀態sql

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

 一、新增數據庫

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

調用Add方法,實際上就是將實體狀態改成added,而後經過saveChanges()保存到數據庫spa

  StudentAddress address = new StudentAddress
            {
                Address = "地址" + DateTime.Now
            };

            db.Entry<StudentAddress>(address).State = System.Data.Entity.EntityState.Added;
            db.SaveChanges();

二、編輯code

  --第一種方法:blog

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

-- 一、與實體字段的值做比較,若是值不變,則不會產生update-sql語句
-- 二、修改了某個字段值,update sql語句只會set 修改某個字段,不會修改所有字段
-- 三、查詢2次數據庫源碼

--第二種方法:it

   StudentAddress address = new StudentAddress
            {
                Id = 36,
                Address = "update地址"
            };

            //一、追加到EF容器中,狀態爲Detached
            var entityEntry = db.Entry(address);//Detached 
            entityEntry.State = System.Data.Entity.EntityState.Modified;
            db.SaveChanges();

 

 --一、將一個遊離的實體 追加到 EF 容器中 io

-- 二、將EF實體狀態改成Modifiedclass

-- 三、修改全部的字段,不管是否變化容器

 

--第三種方法(綜合前兩種修改方法):

  --查詢1次數據庫

  --修改指定的字段

   //一、追加到EF容器中,狀態爲Detached
            var entityEntry = db.Entry(address);//Detached
            Console.WriteLine("追加到EF容器:" + entityEntry.State);

            //二、修改指定字段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();

 

三、刪除亦是如此

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

 

四、源碼

  --每一種數據的變化,都會有相應的集合來保存這些實體的變化

    如:ObjectStateManager 

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

  --當實體變化發生改變時候,調用AddEntityEntryToDictionary,插入到集合中

 

    --調用saveChange(),就會去獲取這些變化,進行操做數據

相關文章
相關標籤/搜索