Пример #1
0
        //public static void Attach<TEntity>(this ObjectSet<TEntity> objectSet, TEntity entity, Action<TEntity> callback, params Expression<Func<object>>[] entityKeyExpressions) where TEntity : class
        //{
        //    objectSet.Attach(entity, callback, objectSet.EntityKey(entityKeyExpressions));
        //}


        public static void AttachAll <TEntity>(this ObjectSet <TEntity> objectSet, IAssociatableCollection <TEntity> entities, Func <ObjectSet <TEntity>, TEntity, bool> predicate) where TEntity : class
        {
            var cascadableCollection = entities as ICascadableCollection <TEntity>;

            foreach (var i in entities.ToArray())
            {
                if (!objectSet.HasAttached(i))
                {
                    var entityKey = objectSet.CreateEntityKey(i);

                    if (objectSet.HasAttached(entityKey))
                    {
                        if (cascadableCollection != null)
                        {
                            cascadableCollection.Remove(i, false);
                        }
                        else
                        {
                            entities.Remove(i);
                        }
                        entities.Add(objectSet.GetObjectByKey(entityKey));
                    }
                    else
                    {
                        if (predicate(objectSet, i))
                        {
                            objectSet.Attach(i);
                        }
                    }
                }
            }

            if (cascadableCollection != null)
            {
                foreach (var i in cascadableCollection.Added)
                {
                    if (objectSet.HasAttached(i))
                    {
                        objectSet.DeleteObject(i);
                    }
                    else
                    {
                        var entityKey = objectSet.CreateEntityKey(i);

                        if (objectSet.HasAttached(entityKey))
                        {
                            objectSet.DeleteObject(objectSet.GetObjectByKey(entityKey));
                        }
                        else
                        {
                            if (predicate(objectSet, i))
                            {
                                objectSet.Attach(i);
                                objectSet.DeleteObject(i);
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        public static bool TryFixAll <TEntity, TForeginKey>(this ObjectSet <TEntity> list, IAssociatableCollection <TEntity> collection, TForeginKey value, Expression <Func <TEntity, TForeginKey> > field)
            where TEntity : class
        {
            var fieldName = ((MemberExpression)field.Body).Member.Name;

            foreach (var i in collection.Added)
            {
                list.TryAttach(i, true);

                i.Members().Properties[fieldName] = value;
            }

            foreach (var i in collection.Removed)
            {
                list.TryAttach(i);
                i.Members().Properties[fieldName] = null;
            }

            return(true);
        }