zoukankan      html  css  js  c++  java
  • 从源代码分析DbSet如何通过ObjectStateManager管理entity lifecycle的生命周期

    一: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

    var state=db.Entity(obj).State;

    db.Entity(obj).State=EntityState.Add 


    三:既然我们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的变化。。。。

  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/dragon-L/p/6517342.html
Copyright © 2011-2022 走看看