private void AttachedList_Changed(object sender, ListChangedEventArgs e)
        {
            object entidad;

            if (e.ListChangedType == ListChangedType.ItemAdded)
            {
                // Se ha añadido un elemento a la lista
                int index = e.NewIndex;
                entidad = _attachedList[index];
                _attachedEntities.Add(entidad);
                _syncList.Insert(index, entidad);

                ITable tabla = OperacionesEntidad.GetTablaFromEntidad(_dataContext, entidad);
                tabla.InsertOnSubmit(entidad);
            }
            else if (e.ListChangedType == ListChangedType.ItemDeleted)
            {
                // Se ha eliminado un elemento de la lista
                entidad = _syncList[e.NewIndex];
                _syncList.RemoveAt(e.NewIndex);

                ITable tabla = OperacionesEntidad.GetTablaFromEntidad(_dataContext, entidad);
                tabla.DeleteOnSubmit(entidad);
            }
        }
        public void AddNew(object entidad)
        {
            _attachedEntities.Add(entidad);

            ITable tabla = OperacionesEntidad.GetTablaFromEntidad(_dataContext, entidad);

            tabla.InsertOnSubmit(entidad);
        }
Example #3
0
        internal DisconnectedChangeSet(DataContext dataContext)
        {
            // Obtenemos el ChangeSet del DataContext
            Dictionary <object, object> listaEntidades = new Dictionary <object, object>();
            ChangeSet changeSet = dataContext.GetChangeSet();

            _modificados = new List <object>(changeSet.Updates);
            _eliminados  = new List <object>(changeSet.Deletes);
            _agregados   = new List <object>(changeSet.Inserts);

            // Obtenemos los valores originales
            int i;

            for (i = 0; i < _modificados.Count; i++)
            {
                _modificadosOriginales.Add(OperacionesEntidad.ObtenerEntidadOriginal(dataContext, _modificados[i]));
            }

            for (i = 0; i < _eliminados.Count; i++)
            {
                _eliminados[i] = OperacionesEntidad.ObtenerEntidadOriginal(dataContext, _eliminados[i]);
            }

            // Creamos copias para no serializar las relaciones
            for (i = 0; i < _modificados.Count; i++)
            {
                _modificados[i] = OperacionesEntidad.CreateDataCopy(_modificados[i], true);
                listaEntidades.Add(changeSet.Updates[i], _modificados[i]);
            }
            for (i = 0; i < _eliminados.Count; i++)
            {
                _eliminados[i] = OperacionesEntidad.CreateDataCopy(_eliminados[i], true);
                listaEntidades.Add(changeSet.Deletes[i], _eliminados[i]);
            }
            for (i = 0; i < _agregados.Count; i++)
            {
                _agregados[i] = OperacionesEntidad.CreateDataCopy(_agregados[i], true);
                listaEntidades.Add(changeSet.Inserts[i], _agregados[i]);
            }
            for (i = 0; i < _modificadosOriginales.Count; i++)
            {
                _modificadosOriginales[i] = OperacionesEntidad.CreateDataCopy(_modificadosOriginales[i], true);
            }

            // Actualizamos asociaciones a copias
            for (i = 0; i < _modificados.Count; i++)
            {
                OperacionesEntidad.ActualizarAsociaciones(changeSet.Updates[i], _modificados[i], listaEntidades);
            }
            for (i = 0; i < _eliminados.Count; i++)
            {
                OperacionesEntidad.ActualizarAsociaciones(changeSet.Deletes[i], _eliminados[i], listaEntidades);
            }
            for (i = 0; i < _agregados.Count; i++)
            {
                OperacionesEntidad.ActualizarAsociaciones(changeSet.Inserts[i], _agregados[i], listaEntidades);
            }
        }
        public void Remove(object entidad)
        {
            ITable tabla = OperacionesEntidad.GetTablaFromEntidad(_dataContext, entidad);

            tabla.DeleteOnSubmit(entidad);
        }
        private object InternalAttach(object entidad, bool rootEntity)
        {
            ITable tabla;
            int    i, j;

            for (i = 0; i < _attachedEntities.Count; i++)
            {
                if (object.ReferenceEquals(entidad, _attachedEntities[i]))
                {
                    // Misma referencia, es un ciclo. No añadimos
                    return(entidad);
                }
                if (OperacionesEntidad.IsPrimaryKeyEqual(entidad, _attachedEntities[i]))
                {
                    // Distintas referencias y mismo Primary Key, sustituimos la referencia del llamante
                    // Sólo lo soportamos para entidades raíz
                    if (rootEntity)
                    {
                        return(_attachedEntities[i]);
                    }
                    else
                    {
                        throw new DuplicateKeyException(entidad);
                    }
                }
            }

            _attachedEntities.Add(entidad);

            if (rootEntity)
            {
                tabla = OperacionesEntidad.GetTablaFromEntidad(_dataContext, entidad);
                tabla.Attach(entidad, false);
            }

            // Adjuntamos las relaciones
            Type entidadType = entidad.GetType();

            PropertyInfo[] properties = entidadType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
            object         propValue;

            for (i = 0; i < properties.Length; i++)
            {
                if (properties[i].GetCustomAttributes(typeof(AssociationAttribute), false).Length > 0)
                {
                    propValue = properties[i].GetValue(entidad, null);
                    if (propValue is IList)
                    {
                        // Es un EntitySet, adjuntamos todas las entidades del mismo
                        IList entitySet = (IList)propValue;
                        for (j = 0; j < entitySet.Count; j++)
                        {
                            InternalAttach(entitySet[j], false);
                        }
                    }
                    else
                    {
                        // Es una entidad
                        if (propValue != null)
                        {
                            InternalAttach(propValue, false);
                        }
                    }
                }
            }

            return(entidad);
        }