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); }
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); }