/// <summary> /// Creates the specified entities in the correct Dependent Order, returning the entities created. /// </summary> /// <param name="service">The service.</param> /// <returns></returns> public Dictionary <Guid, Entity> Create(IOrganizationService service) { var results = new Dictionary <Guid, Entity>(); foreach (var name in EntityDependency.Mapper.EntityCreationOrder) { List <BuilderInfo> values; if (!BuildersByEntityType.TryGetValue(name, out values)) { // Should this be an exception? continue; } foreach (var entity in values.Select(value => CreateEntity(service, value))) { Id id; results.Add(entity.Id, entity); if (Ids.TryGetValue(entity.Id, out id)) { id.Entity = entity; } } } return(results); }
/// <summary> /// Creates the specified entities in the correct Dependent Order, returning the entities created. /// </summary> /// <param name="service">The service.</param> /// <returns></returns> public Dictionary <Guid, Entity> Create(IOrganizationService service) { var results = new Dictionary <Guid, Entity>(); var builders = new List <Tuple <Guid, BuilderInfo> >(); var postCreateUpdates = new List <Entity>(); foreach (var info in EntityDependency.Mapper.EntityCreationOrder) { if (!BuildersByEntityType.TryGetValue(info.LogicalName, out List <BuilderInfo> values)) { // The Entity Creation Order is a Singleton. // If this continue occurs, most likely another instance of a Crm Environment Builder used a type that wasn't utilized by this instance continue; } foreach (var value in values) { try { var entity = CreateEntity(service, value, info.CyclicAttributes, postCreateUpdates); RecordBuiltEntity(entity, value, results, builders); } catch (Exception ex) { var entityName = value.Id.Entity == null ? info.LogicalName : $"Entity {value.Id.LogicalName}{Environment.NewLine}{value.Id.Entity.ToStringAttributes()}"; if (string.IsNullOrWhiteSpace(entityName)) { entityName = info.LogicalName; } throw new CreationFailureException($"An error occured attempting to create {entityName}.{Environment.NewLine}{ex.Message}", ex); } } } foreach (var entity in postCreateUpdates) { try { service.Update(entity); AddPostCreateAttributesToIdEntity(results, entity); } catch (Exception ex) { var entityName = $"Entity {entity.LogicalName}{Environment.NewLine}{entity.ToStringAttributes()}"; throw new CreationFailureException($"An error occured attempting to update an EntityDependency post create for Entity {entityName}.{Environment.NewLine}{ex.Message}", ex); } } // Process Post Updates foreach (var builder in builders) { builder.Item2.Builder.PostCreate(service, results[builder.Item1]); } return(results); }
/// <summary> /// Removes the Builder specified by the Id /// </summary> /// <param name="id">The identifier.</param> public void Remove(Id id) { if (Ids.ContainsKey(id)) { Ids.Remove(id); } if (BuildersByEntityType.TryGetValue(id, out List <BuilderInfo> builders) && Builders.TryGetValue(id, out BuilderInfo builder)) { Builders.Remove(id); builders.Remove(builder); } }
/// <summary> /// Applies the custom action to all Builders for the given type. /// </summary> /// <typeparam name="TBuilder">The type of the builder.</typeparam> /// <param name="logicalName">Name of the logical.</param> /// <param name="action">The action.</param> /// <exception cref="System.Exception"></exception> private void ApplyCustomAction <TBuilder>(string logicalName, Action <TBuilder> action) where TBuilder : class, IEntityBuilder { if (!BuildersByEntityType.TryGetValue(logicalName, out List <BuilderInfo> builders)) { return; } foreach (var result in builders.Select(b => b.Builder)) { if (!(result is TBuilder builder)) { throw new Exception($"Unexpected type of builder! Builder for {logicalName}, was not of type {typeof(TBuilder).FullName}, but type {result.GetType().FullName}."); } action(builder); } }
/// <summary> /// Applies the custom action to all Builders for the given type. /// </summary> /// <typeparam name="TBuilder">The type of the builder.</typeparam> /// <param name="logicalName">Name of the logical.</param> /// <param name="action">The action.</param> /// <exception cref="System.Exception"></exception> private void ApplyCustomAction <TBuilder>(string logicalName, Action <TBuilder> action) where TBuilder : class { List <BuilderInfo> builders; if (!BuildersByEntityType.TryGetValue(logicalName, out builders)) { return; } foreach (var result in builders) { var builder = result as TBuilder; if (builder == null) { throw new Exception(String.Format("Unexpected type of builder! Builder for {0}, was not of type {1}, but type {2}.", logicalName, typeof(TBuilder).FullName, result.GetType().FullName)); } action(builder); } }