コード例 #1
0
        // 记录对 SelfTracking 实体的集合值属性的删除操作。
        internal void RecordRemovalFromCollectionProperties(string propertyName, object value)
        {
            if (_changeTrackingEnabled)
            {
                // 如果在添加实体后重新删除该实体,则不应当在此处执行任何操作
                if (ObjectsAddedToCollectionProperties.ContainsKey(propertyName) &&
                    ObjectsAddedToCollectionProperties[propertyName].Contains(value))
                {
                    ObjectsAddedToCollectionProperties[propertyName].Remove(value);
                    if (ObjectsAddedToCollectionProperties[propertyName].Count == 0)
                    {
                        ObjectsAddedToCollectionProperties.Remove(propertyName);
                    }
                    return;
                }

                if (!ObjectsRemovedFromCollectionProperties.ContainsKey(propertyName))
                {
                    ObjectsRemovedFromCollectionProperties[propertyName] = new ObjectList();
                    ObjectsRemovedFromCollectionProperties[propertyName].Add(value);
                }
                else
                {
                    if (!ObjectsRemovedFromCollectionProperties[propertyName].Contains(value))
                    {
                        ObjectsRemovedFromCollectionProperties[propertyName].Add(value);
                    }
                }
            }
        }
コード例 #2
0
        // Records an addition to collection valued properties on SelfTracking Entities.
        internal void RecordAdditionToCollectionProperties(string propertyName, object value)
        {
            if (_changeTrackingEnabled)
            {
                // Add the entity back after deleting it, we should do nothing here then
                if (ObjectsRemovedFromCollectionProperties.ContainsKey(propertyName) &&
                    ObjectsRemovedFromCollectionProperties[propertyName].Contains(value))
                {
                    ObjectsRemovedFromCollectionProperties[propertyName].Remove(value);
                    if (ObjectsRemovedFromCollectionProperties[propertyName].Count == 0)
                    {
                        ObjectsRemovedFromCollectionProperties.Remove(propertyName);
                    }
                    return;
                }

                if (!ObjectsAddedToCollectionProperties.ContainsKey(propertyName))
                {
                    ObjectsAddedToCollectionProperties[propertyName] = new ObjectList();
                    ObjectsAddedToCollectionProperties[propertyName].Add(value);
                }
                else
                {
                    ObjectsAddedToCollectionProperties[propertyName].Add(value);
                }
            }
        }
コード例 #3
0
ファイル: Model1.cs プロジェクト: twMVC/twMVC-1-2
        // 記錄 SelfTracking 實體上之集合值屬性的移除。
        internal void RecordRemovalFromCollectionProperties(string propertyName, object value)
        {
            if (_changeTrackingEnabled)
            {
                // 在加入該實體後再將其刪除,我們在此處應該不用執行任何動作,接著
                if (ObjectsAddedToCollectionProperties.ContainsKey(propertyName) &&
                    ObjectsAddedToCollectionProperties[propertyName].Contains(value))
                {
                    ObjectsAddedToCollectionProperties[propertyName].Remove(value);
                    if (ObjectsAddedToCollectionProperties[propertyName].Count == 0)
                    {
                        ObjectsAddedToCollectionProperties.Remove(propertyName);
                    }
                    return;
                }

                if (!ObjectsRemovedFromCollectionProperties.ContainsKey(propertyName))
                {
                    ObjectsRemovedFromCollectionProperties[propertyName] = new ObjectList();
                    ObjectsRemovedFromCollectionProperties[propertyName].Add(value);
                }
                else
                {
                    if (!ObjectsRemovedFromCollectionProperties[propertyName].Contains(value))
                    {
                        ObjectsRemovedFromCollectionProperties[propertyName].Add(value);
                    }
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Trackables the collection changed.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="NotifyTrackableCollectionChangedEventArgs"/> instance containing the event data.</param>
        /// <param name="propertyName">Name of the property.</param>
        private void TrackableCollectionChanged(object sender, NotifyCollectionChangedEventArgs e, string propertyName)
        {
            switch (e.Action)
            {
            case NotifyCollectionChangedAction.Add:
                foreach (var newItem in e.NewItems)
                {
                    //todo:implémenter la récursivité sur l'ajout des élements dans la collection
                    //var project = newItem as IObjectWithChangeTracker;
                    //if (project != null)
                    //{
                    //    if (ChangeTrackingEnabled)
                    //    {
                    //        project.ChangeTracker.Start();
                    //    }
                    //}
                    RecordAdditionToCollectionProperties(propertyName, newItem);
                }
                break;

            case NotifyCollectionChangedAction.Remove:
                foreach (var odlItem in e.OldItems)
                {
                    RecordRemovalFromCollectionProperties(propertyName, odlItem);
                }
                break;

            case NotifyCollectionChangedAction.Reset:
            {
                // Cas d'un Clear sur la collection.
                // Vide le cache des modifications pour la collection.
                if (ObjectsRemovedFromCollectionProperties.ContainsKey(propertyName))
                {
                    ObjectsRemovedFromCollectionProperties.Remove(propertyName);
                }

                if (ObjectsAddedToCollectionProperties.ContainsKey(propertyName))
                {
                    ObjectsAddedToCollectionProperties.Remove(propertyName);
                }

                // Tranfère les données de départ dans les élements supprimés.
                if (ObjectsOriginalFromCollectionProperties.Count > 0)
                {
                    foreach (var item in ObjectsOriginalFromCollectionProperties[propertyName])
                    {
                        RecordRemovalFromCollectionProperties(propertyName, item);
                    }
                }
            }
            break;

            case NotifyCollectionChangedAction.Replace:
            {
                // Comment gérer le cas d'un changement d'instance dans la liste ?
            }
            break;
            }
            UpdateChangeState();
        }
コード例 #5
0
        // Registra una eliminación a las propiedades con valor de la colección en las entidades SelfTracking.
        internal void RecordRemovalFromCollectionProperties(string propertyName, object value)
        {
            if (_changeTrackingEnabled)
            {
                // Eliminar la entidad después de agregarla, no se debe hacer nada aquí
                if (ObjectsAddedToCollectionProperties.ContainsKey(propertyName) &&
                    ObjectsAddedToCollectionProperties[propertyName].Contains(value))
                {
                    ObjectsAddedToCollectionProperties[propertyName].Remove(value);
                    if (ObjectsAddedToCollectionProperties[propertyName].Count == 0)
                    {
                        ObjectsAddedToCollectionProperties.Remove(propertyName);
                    }
                    return;
                }

                if (!ObjectsRemovedFromCollectionProperties.ContainsKey(propertyName))
                {
                    ObjectsRemovedFromCollectionProperties[propertyName] = new ObjectList();
                    ObjectsRemovedFromCollectionProperties[propertyName].Add(value);
                }
                else
                {
                    if (!ObjectsRemovedFromCollectionProperties[propertyName].Contains(value))
                    {
                        ObjectsRemovedFromCollectionProperties[propertyName].Add(value);
                    }
                }
            }
        }
コード例 #6
0
 // Resets the ObjectChangeTracker to the Unchanged state and
 // clears the original values as well as the record of changes
 // to collection properties
 public void AcceptChanges()
 {
     OnObjectStateChanging(ObjectState.Unchanged);
     OriginalValues.Clear();
     ObjectsAddedToCollectionProperties.Clear();
     ObjectsRemovedFromCollectionProperties.Clear();
     ChangeTrackingEnabled = true;
     _objectState          = ObjectState.Unchanged;
 }
コード例 #7
0
 // Resets the ObjectChangeTracker to the Unchanged state and
 // clears the original values as well as the record of changes
 // to collection properties
 public void AcceptChanges()
 {
     ModifiedProperties.Clear();
     OriginalValues.Clear();
     ObjectsAddedToCollectionProperties.Clear();
     ObjectsRemovedFromCollectionProperties.Clear();
     IsChangeTrackingEnabled = true;
     State = ObjectState.Unchanged;
 }
コード例 #8
0
 // Resets the ObjectChangeTracker to the Unchanged state and
 // clears the original values as well as the record of changes
 // to collection properties
 public void ResetTracking()
 {
     if (objectTrackingEnabledField)
     {
         originalobjectStateField = ObjectState.Unchanged;
         ResetOriginalValue();
         ObjectsAddedToCollectionProperties.Clear();
         ObjectsRemovedFromCollectionProperties.Clear();
         ObjectsOriginalFromCollectionProperties.Clear();
         InitOriginalValue();
         UpdateChangeState();
     }
 }
コード例 #9
0
        // Resets the ObjectChangeTracker to the Unchanged state and
        // rollback the original values as well as the record of changes
        // to collection properties
        public void CancelChanges()
        {
            OnObjectStateChanging(ObjectState.Unchanged);
            // rollback original values
            Type type = _parentObject.GetType();

            foreach (var originalValue in OriginalValues.ToList())
            {
                type.GetProperty(originalValue.Key).SetValue(
                    _parentObject, originalValue.Value, null);
            }
            // create copy of ObjectsAddedToCollectionProperties
            // and ObjectsRemovedFromCollectionProperties
            Dictionary <string, ObjectList> removeCollection =
                ObjectsAddedToCollectionProperties.ToDictionary(n => n.Key, n => n.Value);
            Dictionary <string, ObjectList> addCollection =
                ObjectsRemovedFromCollectionProperties.ToDictionary(n => n.Key, n => n.Value);

            // rollback ObjectsAddedToCollectionProperties
            if (removeCollection.Count > 0)
            {
                foreach (KeyValuePair <string, ObjectList> entry in removeCollection)
                {
                    PropertyInfo collectionProperty = type.GetProperty(entry.Key);
                    IList        collectionObject   = (IList)collectionProperty.GetValue(_parentObject, null);
                    foreach (object obj in entry.Value.ToList())
                    {
                        collectionObject.Remove(obj);
                    }
                }
            }
            // rollback ObjectsRemovedFromCollectionProperties
            if (addCollection.Count > 0)
            {
                foreach (KeyValuePair <string, ObjectList> entry in addCollection)
                {
                    PropertyInfo collectionProperty = type.GetProperty(entry.Key);
                    IList        collectionObject   = (IList)collectionProperty.GetValue(_parentObject, null);
                    foreach (object obj in entry.Value.ToList())
                    {
                        collectionObject.Add(obj);
                    }
                }
            }
            OriginalValues.Clear();
            ObjectsAddedToCollectionProperties.Clear();
            ObjectsRemovedFromCollectionProperties.Clear();
            _objectState = ObjectState.Unchanged;
            OnObjectStateChanged(ObjectState.Unchanged);
        }
コード例 #10
0
 // Records a removal to collection valued properties on SelfTracking Entities.
 internal void RecordRemovalFromCollectionProperties(string propertyName, Entity value)
 {
     if (IsChangeTrackingEnabled && _objectState != ObjectState.Added)
     {
         // Deleteing the entity after it has been added, we should do nothing here then
         if (ObjectsAddedToCollectionProperties.ContainsKey(propertyName) &&
             ObjectsAddedToCollectionProperties[propertyName].Contains(value))
         {
             ObjectsAddedToCollectionProperties[propertyName].Remove(value);
             if (ObjectsAddedToCollectionProperties[propertyName].Count == 0)
             {
                 ObjectsAddedToCollectionProperties.Remove(propertyName);
             }
         }
         else
         {
             if (!ObjectsRemovedFromCollectionProperties.ContainsKey(propertyName))
             {
                 ObjectsRemovedFromCollectionProperties[propertyName] = new EntityList();
             }
             ObjectsRemovedFromCollectionProperties[propertyName].Add(value);
         }
     }
 }