/// <summary> /// Creates a new relation. /// </summary> public async Task CreateAsync(RelationEditorVM vm, ClaimsPrincipal principal) { await ValidateRequestAsync(vm, isNew : true); var rels = new List <Relation>(); var changesets = new List <Changeset>(); var groupId = vm.SourceIds.Length > 1 ? Guid.NewGuid() : (Guid?)null; var user = await GetUserAsync(principal); foreach (var srcId in vm.SourceIds) { var rel = _mapper.Map <Relation>(vm); rel.Id = Guid.NewGuid(); rel.SourceId = srcId; var compRel = new Relation { Id = Guid.NewGuid() }; MapComplementaryRelation(rel, compRel); rels.Add(rel); rels.Add(compRel); changesets.Add(GetChangeset(null, _mapper.Map <RelationEditorVM>(rel), rel.Id, user, null, groupId)); } await _validator.ValidateAsync(rels); _db.Changes.AddRange(changesets); _db.Relations.AddRange(rels); _cache.Clear(); }
/// <summary> /// Creates a new relation. /// </summary> public async Task CreateAsync(RelationEditorVM vm, ClaimsPrincipal principal) { await ValidateRequestAsync(vm, isNew : true); var newRels = new List <Relation>(); var updatedRels = new List <Relation>(); var groupId = vm.SourceIds.Length > 1 ? Guid.NewGuid() : (Guid?)null; var removedRelations = await _db.Relations .Where(x => vm.SourceIds.Contains(x.SourceId) && x.DestinationId == vm.DestinationId && x.Type == vm.Type && x.Id != vm.Id && x.IsDeleted == true) .ToDictionaryAsync(x => x.SourceId, x => x); var user = await GetUserAsync(principal); foreach (var srcId in vm.SourceIds) { Relation rel; if (removedRelations.TryGetValue(srcId, out rel)) { rel.IsDeleted = false; updatedRels.Add(rel); } else { rel = _mapper.Map <Relation>(vm); rel.Id = Guid.NewGuid(); rel.SourceId = srcId; newRels.Add(rel); } var compRel = new Relation { Id = Guid.NewGuid() }; MapComplementaryRelation(rel, compRel); newRels.Add(compRel); _db.Changes.Add(GetChangeset(null, _mapper.Map <RelationEditorVM>(rel), rel.Id, user, null, groupId)); } await _validator.ValidateAsync(newRels.Concat(updatedRels).ToList()); _db.Relations.AddRange(newRels); _cache.Clear(); }