public async Task <UserDTO> Register(UserTransferDTO dto) { NetworkEntity userEntity = DataContext.NetworkEntities.Add(new NetworkEntity { NetworkID = dto.NetworkID, NetworkEntityID = dto.ID, EntityType = EntityType.User }); Data.User user = DataContext.Users.Add(new Data.User() { ID = userEntity.ID, UserName = dto.UserName, FirstName = dto.FirstName, LastName = dto.LastName, MiddleName = dto.MiddleName, PhoneNumber = dto.PhoneNumber, FaxNumber = dto.FaxNumber, EmailAddress = dto.EmailAddress, NetworkID = dto.NetworkID, OrganizationID = dto.OrganizationID, Salutation = dto.Salutation, }); await DataContext.SaveChangesAsync(); if (dto.Metadata != null && dto.Metadata.Count() > 0) { IList <Data.UserDomainData> metadata = new List <Data.UserDomainData>(); foreach (var meta in dto.Metadata) { var orgMeta = new UserDomainData() { UserID = user.ID, DomainUseID = meta.DomainUseID, Value = meta.Value, SequenceNumber = meta.SequenceNumber, }; if (meta.DomainReferenceID.HasValue) { orgMeta.DomainReferenceID = meta.DomainReferenceID.Value; } metadata.Add(orgMeta); } if (metadata.Count > 0) { DataContext.DomainDatas.AddRange(metadata); } await DataContext.SaveChangesAsync(); } return(user.Map <User, UserDTO>()); }
public async Task <UserDTO> Update(UserTransferDTO dto) { var user = await DataContext.Users.FindAsync(dto.ID); if (user.Deleted) { throw new Exception("The specified User was no found"); } user.UserName = dto.UserName; user.FirstName = dto.FirstName; user.LastName = dto.LastName; user.MiddleName = dto.MiddleName; user.PhoneNumber = dto.PhoneNumber; user.FaxNumber = dto.FaxNumber; user.EmailAddress = dto.EmailAddress; user.Salutation = dto.Salutation; user.Active = dto.Active; await DataContext.SaveChangesAsync(); var userMetadata = await DataContext.DomainDatas.OfType <UserDomainData>().Where(x => x.UserID == dto.ID).ToArrayAsync(); if (dto.Metadata != null && dto.Metadata.Count() > 0) { IList <UserDomainData> metaDataToAdd = new List <UserDomainData>(); foreach (var meta in dto.Metadata.Where(m => !m.ID.HasValue)) { var userMeta = new UserDomainData() { UserID = dto.ID, DomainUseID = meta.DomainUseID, Value = meta.Value, SequenceNumber = meta.SequenceNumber, }; if (meta.DomainReferenceID.HasValue) { userMeta.DomainReferenceID = meta.DomainReferenceID.Value; } metaDataToAdd.Add(userMeta); } if (metaDataToAdd.Count > 0) { DataContext.DomainDatas.AddRange(metaDataToAdd); } foreach (var meta in userMetadata.Where(org => dto.Metadata.Any(m => m.ID == org.ID && (org.Value != m.Value || org.SequenceNumber != m.SequenceNumber || org.DomainReferenceID != m.DomainReferenceID)))) { var diff = dto.Metadata.Where(m => m.ID == meta.ID).FirstOrDefault(); DataContext.DomainDatas.Attach(meta); if (meta.Value != diff.Value) { meta.Value = diff.Value; } if (meta.SequenceNumber != diff.SequenceNumber) { meta.SequenceNumber = diff.SequenceNumber; } if (meta.DomainReferenceID != diff.DomainReferenceID) { meta.DomainReferenceID = diff.DomainReferenceID; } } await DataContext.SaveChangesAsync(); } var metadataIDs = dto.Metadata.Where(x => x.ID.HasValue).Select(x => x.ID.Value); var remove = (from d in userMetadata where !metadataIDs.Contains(d.ID) && d.UserID == dto.ID select d.ID).ToArray(); if (remove.Count() > 0) { //Have to do this cause of trigger var removeIDs = String.Join(",", remove.Select(x => String.Format("'{0}'", x))); await DataContext.Database.ExecuteSqlCommandAsync(string.Format("delete from UserDomainData where ID IN ({0})", removeIDs)); } return(user.Map <User, UserDTO>()); }