public void Update(IEnumerable <IData> dataset, bool suppressEventing, bool performForeignKeyIntegrityCheck, bool performValidation) { Verify.ArgumentNotNull(dataset, "dataset"); var sortedDataset = dataset.ToDataProviderAndInterfaceTypeSortedDictionary(); if (!suppressEventing) { foreach (IData data in dataset) { DataEventSystemFacade.FireDataBeforeUpdateEvent(data.DataSourceId.InterfaceType, data); } } foreach (IData data in dataset) { if (performValidation) { CheckValidationResult(ValidationFacade.Validate(data), data.DataSourceId.InterfaceType); } if (performForeignKeyIntegrityCheck) { data.ValidateForeignKeyIntegrity(); } } foreach (KeyValuePair <string, Dictionary <Type, List <IData> > > providerPair in sortedDataset) { foreach (KeyValuePair <Type, List <IData> > interfaceTypePair in providerPair.Value) { List <IData> dataToUpdate = interfaceTypePair.Value; if (DataCachingFacade.IsTypeCacheable(interfaceTypePair.Key)) { List <IData> newDataToUpdate = new List <IData>(); foreach (IData d in interfaceTypePair.Value) { newDataToUpdate.Add(DataWrappingFacade.UnWrap(d)); } dataToUpdate = newDataToUpdate; } DataProviderPluginFacade.Update(providerPair.Key, dataToUpdate); if (DataCachingFacade.IsTypeCacheable(interfaceTypePair.Key)) { DataCachingFacade.ClearCache(interfaceTypePair.Key); } } } if (!suppressEventing) { foreach (IData data in dataset) { DataEventSystemFacade.FireDataAfterUpdateEvent(data.DataSourceId.InterfaceType, data); } } }
private static List <T> AddNew_AddingMethod <T>(string providerName, IEnumerable <T> dataset, bool suppressEventing, bool performForeignKeyIntegrityCheck, bool performValidation) where T : class, IData { Verify.ArgumentNotNullOrEmpty(providerName, "providerName"); Verify.ArgumentNotNull(dataset, "dataset"); Verify.ArgumentCondition(!dataset.Contains(null), "dataset", "The enumeration may not contain null values"); List <string> writeableProviders = DataProviderRegistry.GetWriteableDataProviderNamesByInterfaceType(typeof(T)); if (!writeableProviders.Contains(providerName)) { Log.LogVerbose(LogTitle, $"Type data interface '{typeof(T)}' is marked auto updateable and is not supported by the provider '{providerName}', adding it"); DynamicTypeManager.EnsureCreateStore(typeof(T), providerName); } writeableProviders = DataProviderRegistry.GetWriteableDataProviderNamesByInterfaceType(typeof(T)); if (!writeableProviders.Contains(providerName)) { throw new InvalidOperationException($"The writeable data providers '{providerName}' does not support the interface '{typeof(T)}'."); } foreach (T data in dataset) { if (performValidation) { CheckValidationResult(ValidationFacade.Validate <T>(data), typeof(T)); } if (performForeignKeyIntegrityCheck) { data.ValidateForeignKeyIntegrity(); } } if (!suppressEventing) { foreach (T data in dataset) { DataEventSystemFacade.FireDataBeforeAddEvent <T>(data); } } List <T> addedDataset = DataProviderPluginFacade.AddNew <T>(providerName, dataset); DataCachingFacade.ClearCache(typeof(T), DataScopeManager.MapByType(typeof(T)), LocalizationScopeManager.MapByType(typeof(T))); if (!suppressEventing) { foreach (T data in addedDataset) { DataEventSystemFacade.FireDataAfterAddEvent <T>(data); } } return(addedDataset); }
private void Delete <T>(IEnumerable <T> dataset, bool suppressEventing, CascadeDeleteType cascadeDeleteType, bool referencesFromAllScopes, HashSet <DataSourceId> dataPendingDeletion) where T : class, IData { Verify.ArgumentNotNull(dataset, nameof(dataset)); dataset = dataset.Evaluate(); foreach (var data in dataset) { var dataSourceId = data.DataSourceId; if (!dataPendingDeletion.Contains(dataSourceId)) { dataPendingDeletion.Add(dataSourceId); } } if (cascadeDeleteType != CascadeDeleteType.Disable) { foreach (IData element in dataset) { Verify.ArgumentCondition(element != null, nameof(dataset), "dataset may not contain nulls"); if (!element.IsDataReferred()) { continue; } Type interfaceType = element.DataSourceId.InterfaceType; // Not deleting references if the data is versioned and not all of the // versions of the element are to be deleted if (element is IVersioned) { var key = element.GetUniqueKey(); var versions = DataFacade.TryGetDataVersionsByUniqueKey(interfaceType, key).ToList(); if (versions.Count > 1 && (dataset.Count() < versions.Count || !versions.All(v => dataPendingDeletion.Contains(v.DataSourceId)))) { continue; } } Verify.IsTrue(cascadeDeleteType != CascadeDeleteType.Disallow, "One of the given datas is referenced by one or more datas"); element.RemoveOptionalReferences(); IEnumerable <IData> referees; using (new DataScope(element.DataSourceId.DataScopeIdentifier)) { // For some weird reason, this line does not work.... /MRJ // IEnumerable<IData> referees = dataset.GetRefereesRecursively(); referees = element.GetReferees(referencesFromAllScopes) .Where(reference => !dataPendingDeletion.Contains(reference.DataSourceId)) .Evaluate(); } foreach (IData referee in referees) { if (!referee.CascadeDeleteAllowed(interfaceType)) { throw new InvalidOperationException("One of the given datas is referenced by one or more datas that does not allow cascade delete"); } } Delete <IData>(referees, suppressEventing, cascadeDeleteType, referencesFromAllScopes); } } Dictionary <string, Dictionary <Type, List <IData> > > sortedDatas = dataset.ToDataProviderAndInterfaceTypeSortedDictionary(); foreach (KeyValuePair <string, Dictionary <Type, List <IData> > > providerPair in sortedDatas) { foreach (KeyValuePair <Type, List <IData> > interfaceTypePair in providerPair.Value) { DataProviderPluginFacade.Delete(providerPair.Key, interfaceTypePair.Value.Select(d => d.DataSourceId)); if (DataCachingFacade.IsTypeCacheable(interfaceTypePair.Key)) { DataCachingFacade.ClearCache(interfaceTypePair.Key, interfaceTypePair.Value.First().DataSourceId.DataScopeIdentifier); } } } if (!suppressEventing) { foreach (IData element in dataset) { DataEventSystemFacade.FireDataDeletedEvent(element.DataSourceId.InterfaceType, element); } } }