diff --git a/server/AyaNova/biz/PartAssemblyBiz.cs b/server/AyaNova/biz/PartAssemblyBiz.cs index 5fede792..d190bf74 100644 --- a/server/AyaNova/biz/PartAssemblyBiz.cs +++ b/server/AyaNova/biz/PartAssemblyBiz.cs @@ -60,36 +60,7 @@ namespace AyaNova.Biz } } - /* - static void Main(string[] args) - { - using (var dbContext = new DbParentChild()) - { - var parent = new Parent - { - FirstName = "Joe", - LastName = "Smith" - }; - - parent.Children.Add( - new Child - { - FirstName = "LittleJoe", - LastName = "Smith" - }); - parent.Children.Add( - new Child - { - FirstName = "Anne", - LastName = "Smith" - }); - - dbContext.Add(parent); - dbContext.SaveChanges(); - } - } - */ - + //////////////////////////////////////////////////////////////////////////////////////////////// //DUPLICATE // @@ -135,9 +106,10 @@ namespace AyaNova.Biz return ret; } - //////////////////////////////////////////////////////////////////////////////////////////////// + /* + //////////////////////////////////////////////////////////////////////////////////////////////// //UPDATE - // + //this is how it was roughly internal async Task PutAsync(PartAssembly putObject) { // PartAssembly dbObject = await ct.PartAssembly.SingleOrDefaultAsync(m => m.Id == putObject.Id); @@ -147,9 +119,9 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND, "id"); return null; } - // PartAssembly SnapshotOfOriginalDBObj = new PartAssembly(); - //CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); - //CopyObject.Copy(putObject, dbObject, "Id"); + PartAssembly SnapshotOfOriginalDBObj = new PartAssembly(); + CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); + CopyObject.Copy(putObject, dbObject, "Id"); dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; @@ -173,6 +145,44 @@ namespace AyaNova.Biz await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); return dbObject; } + */ + + //////////////////////////////////////////////////////////////////////////////////////////////// + //UPDATE + // + internal async Task PutAsync(PartAssembly putObject) + { + //Get the db object with no tracking as about to be replaced not updated + PartAssembly dbObject = await GetAsync(putObject.Id, false); + if (dbObject == null) + { + AddError(ApiErrorCode.NOT_FOUND, "id"); + return null; + } + + putObject.Tags = TagBiz.NormalizeTags(putObject.Tags); + putObject.CustomFields = JsonUtil.CompactJson(putObject.CustomFields); + await ValidateAsync(putObject, dbObject); + ct.Replace(dbObject,putObject); + if (HasErrors) return null; + try + { + await ct.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!await ExistsAsync(putObject.Id)) + AddError(ApiErrorCode.NOT_FOUND); + else + AddError(ApiErrorCode.CONCURRENCY_CONFLICT); + return null; + } + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); + await SearchIndexAsync(dbObject, false); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags,dbObject.Tags); + await HandlePotentialNotificationEvent(AyaEvent.Modified, putObject, dbObject); + return putObject; + } //////////////////////////////////////////////////////////////////////////////////////////////// //DELETE diff --git a/server/AyaNova/models/AyContext.cs b/server/AyaNova/models/AyContext.cs index 7eace9b2..eb9968c0 100644 --- a/server/AyaNova/models/AyContext.cs +++ b/server/AyaNova/models/AyContext.cs @@ -90,7 +90,12 @@ namespace AyaNova.Models public AyContext(DbContextOptions options) : base(options) { } - + //https://stackoverflow.com/a/64053832/8939 + public void Replace(TEntity oldEntity, TEntity newEntity) where TEntity : class + { + ChangeTracker.TrackGraph(oldEntity, e => e.Entry.State = EntityState.Deleted); + ChangeTracker.TrackGraph(newEntity, e => e.Entry.State = e.Entry.IsKeySet ? EntityState.Modified : EntityState.Added); + } protected override void OnModelCreating(ModelBuilder modelBuilder) {