时间:2021-07-01 10:21:17 帮助过:27人阅读
一:Savechange的时候,怎么知道哪些entity被add,modify,delete,unchange ????
   如何来辨别。。。
在entity中打上标记来做表示。。。已经被跟踪了。。。当每个entity被打上标记之后,我们才可以
从这些标记获取相应的操作。。。
二:ef如何做到的。。 ObjectStateManager类来管理每个entity的标记。。。
private Dictionary<EntityKey, EntityEntry> _addedEntityStore;
private Dictionary<EntityKey, EntityEntry> _deletedEntityStore;
private Dictionary<EntityKey, EntityEntry> _modifiedEntityStore;
private Dictionary<EntityKey, EntityEntry> _unchangedEntityStore;
 private void AddEntityEntryToDictionary
DbSet.Add 做的操作 将新的entity塞入到指定的dic中。。。
SaveChange获取的时候:
this.PullModifiedEntriesFromStateManager();
            
this.PullUnchangedEntriesFromStateManager();
        private void PullModifiedEntriesFromStateManager()
        {
            foreach (System.Data.Entity.Core.IEntityStateEntry entry in this._stateManager.GetEntityStateEntries(EntityState.Added))
            {
                if (!entry.IsRelationship && !entry.IsKeyEntry)
                {
                    this.KeyManager.RegisterKeyValueForAddedEntity(entry);
                }
            }
            foreach (System.Data.Entity.Core.IEntityStateEntry entry2 in this._stateManager.GetEntityStateEntries(EntityState.Modified | EntityState.Deleted | EntityState.Added))
            {
                this.RegisterReferentialConstraints(entry2);
            }
            foreach (System.Data.Entity.Core.IEntityStateEntry entry3 in this._stateManager.GetEntityStateEntries(EntityState.Modified | EntityState.Deleted | EntityState.Added))
            {
                this.LoadStateEntry(entry3);
            }
        }
        internal virtual IEnumerable<ObjectStateEntry> GetObjectStateEntriesInternal(EntityState state)
        {
            ObjectStateEntry[] entryArray = new ObjectStateEntry[this.GetObjectStateEntriesCount(state)];
            int num = 0;
            if (((EntityState.Added & state) != 0) && (this._addedRelationshipStore != null))
            {
                foreach (KeyValuePair<RelationshipWrapper, RelationshipEntry> pair in this._addedRelationshipStore)
                {
                    entryArray[num++] = pair.Value;
                }
            }
            if (((EntityState.Deleted & state) != 0) && (this._deletedRelationshipStore != null))
            {
                foreach (KeyValuePair<RelationshipWrapper, RelationshipEntry> pair2 in this._deletedRelationshipStore)
                {
                    entryArray[num++] = pair2.Value;
                }
            }
            if (((EntityState.Unchanged & state) != 0) && (this._unchangedRelationshipStore != null))
            {
                foreach (KeyValuePair<RelationshipWrapper, RelationshipEntry> pair3 in this._unchangedRelationshipStore)
                {
                    entryArray[num++] = pair3.Value;
                }
            }
            if (((EntityState.Added & state) != 0) && (this._addedEntityStore != null))
            {
                foreach (KeyValuePair<EntityKey, EntityEntry> pair4 in this._addedEntityStore)
                {
                    entryArray[num++] = pair4.Value;
                }
            }
            if (((EntityState.Modified & state) != 0) && (this._modifiedEntityStore != null))
            {
                foreach (KeyValuePair<EntityKey, EntityEntry> pair5 in this._modifiedEntityStore)
                {
                    entryArray[num++] = pair5.Value;
                }
            }
            if (((EntityState.Deleted & state) != 0) && (this._deletedEntityStore != null))
            {
                foreach (KeyValuePair<EntityKey, EntityEntry> pair6 in this._deletedEntityStore)
                {
                    entryArray[num++] = pair6.Value;
                }
            }
            if (((EntityState.Unchanged & state) != 0) && (this._unchangedEntityStore != null))
            {
                foreach (KeyValuePair<EntityKey, EntityEntry> pair7 in this._unchangedEntityStore)
                {
                    entryArray[num++] = pair7.Value;
                }
            }
            return entryArray;
        }
GetEntityStateEntries 
三:既然我们savechange是的时候,是通过entity的状态去获取。。。
     //
    // 摘要:
    //     Describes the state of an entity.
    [Flags]
    [SuppressMessage("Microsoft.Naming", "CA1714:FlagsEnumsShouldHavePluralNames")]
    public enum EntityState
    {
        //
        // 摘要:
        //     The entity is not being tracked by the context. An entity is in this state immediately
        //     after it has been created with the new operator or with one of the System.Data.Entity.DbSet
        //     Create methods.
        Detached = 1,
        //
        // 摘要:
        //     The entity is being tracked by the context and exists in the database, and its
        //     property values have not changed from the values in the database.
        Unchanged = 2,
        //
        // 摘要:
        //     The entity is being tracked by the context but does not yet exist in the database.
        Added = 4,
        //
        // 摘要:
        //     The entity is being tracked by the context and exists in the database, but has
        //     been marked for deletion from the database the next time SaveChanges is called.
        Deleted = 8,
        //
        // 摘要:
        //     The entity is being tracked by the context and exists in the database, and some
        //     or all of its property values have been modified.
        Modified = 16
    }
using (SchoolDBEntities db = new SchoolDBEntities())
            {
                var item = db.Students.FirstOrDefault();
item.StudentName = "asdfasdfasdfasd";
                db.SaveChanges();
            }
	    
//有一个比较器,来判断是”局部修改“ 还是 ”全局修改“。。。。
仓储模式的必然之路,如何跟踪entity的变化。。。。
从源代码分析DbSet如何通过ObjectStateManager管理entity lifecycle的生命周期
标签:data rom mic sre ons 指定 sof track tee