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的变化。。。。

  • 相关阅读:
    js基本
    js循环语句
    常用的css
    Linux使用host-only的方式上网
    Struts2的文件上传及错误国际化显示
    ThinkPHP3.2.2 大写子母的用法及含义
    php中验证码不显示问题
    AOP中的ASPECTJ
    CGLIB和JDK代理
    mavne的创建
  • 原文地址:https://www.cnblogs.com/dragon-L/p/6517342.html
Copyright © 2011-2022 走看看