diff --git a/server/AyaNova/biz/ContractBiz.cs b/server/AyaNova/biz/ContractBiz.cs index 974828e6..6e3d1c38 100644 --- a/server/AyaNova/biz/ContractBiz.cs +++ b/server/AyaNova/biz/ContractBiz.cs @@ -93,7 +93,7 @@ namespace AyaNova.Biz // internal async Task GetAsync(long id, bool logTheGetEvent = true) { - var ret = await ct.Contract.SingleOrDefaultAsync(m => m.Id == id); + var ret = await ct.Contract.AsNoTracking().SingleOrDefaultAsync(m => m.Id == id); if (logTheGetEvent && ret != null) await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); return ret; @@ -104,20 +104,18 @@ namespace AyaNova.Biz // internal async Task PutAsync(Contract putObject) { - Contract dbObject = await ct.Contract.SingleOrDefaultAsync(m => m.Id == putObject.Id); + Contract dbObject = await GetAsync(putObject.Id,false); if (dbObject == null) { AddError(ApiErrorCode.NOT_FOUND, "id"); return null; } - Contract SnapshotOfOriginalDBObj = new Contract(); - 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; - await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); - if (HasErrors) return null; + + putObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); + putObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); + await ValidateAsync(putObject, dbObject); + if (HasErrors) return null; + ct.Replace(dbObject, putObject); try { await ct.SaveChangesAsync(); @@ -130,10 +128,10 @@ namespace AyaNova.Biz 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, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); - await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); + await SearchIndexAsync(putObject, false); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags, dbObject.Tags); + await HandlePotentialNotificationEvent(AyaEvent.Modified, putObject, dbObject); return dbObject; } @@ -146,7 +144,7 @@ namespace AyaNova.Biz { try { - Contract dbObject = await ct.Contract.SingleOrDefaultAsync(m => m.Id == id); + Contract dbObject = await GetAsync(id, false); if (dbObject == null){ AddError(ApiErrorCode.NOT_FOUND); return false; @@ -191,7 +189,7 @@ namespace AyaNova.Biz public async Task GetSearchResultSummary(long id) { - var obj = await ct.Contract.SingleOrDefaultAsync(z => z.Id == id); + var obj = await GetAsync(id, false); var SearchParams = new Search.SearchIndexProcessObjectParameters(); DigestSearchText(obj,SearchParams); return SearchParams; diff --git a/server/AyaNova/biz/CustomerBiz.cs b/server/AyaNova/biz/CustomerBiz.cs index 07758679..42f79450 100644 --- a/server/AyaNova/biz/CustomerBiz.cs +++ b/server/AyaNova/biz/CustomerBiz.cs @@ -109,7 +109,7 @@ namespace AyaNova.Biz // internal async Task PutAsync(Customer putObject) { - Customer dbObject = await GetAsync(putObject.Id, false); + var dbObject = await GetAsync(putObject.Id, false); if (dbObject == null) { AddError(ApiErrorCode.NOT_FOUND, "id"); diff --git a/server/AyaNova/biz/CustomerNoteBiz.cs b/server/AyaNova/biz/CustomerNoteBiz.cs index 12aae575..66b56231 100644 --- a/server/AyaNova/biz/CustomerNoteBiz.cs +++ b/server/AyaNova/biz/CustomerNoteBiz.cs @@ -63,7 +63,7 @@ namespace AyaNova.Biz // internal async Task GetAsync(long id, bool logTheGetEvent = true) { - var ret = await ct.CustomerNote.SingleOrDefaultAsync(m => m.Id == id); + var ret = await ct.CustomerNote.AsNoTracking().SingleOrDefaultAsync(m => m.Id == id); if (logTheGetEvent && ret != null) await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); return ret; @@ -80,14 +80,11 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND, "id"); return null; } - CustomerNote SnapshotOfOriginalDBObj = new CustomerNote(); - CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); - CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); - ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; - //await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); + putObject.Tags = TagBiz.NormalizeTags(putObject.Tags); + //no validate required if (HasErrors) return null; + ct.Replace(dbObject, putObject); try { await ct.SaveChangesAsync(); @@ -101,8 +98,8 @@ namespace AyaNova.Biz return null; } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); - await SearchIndexAsync(dbObject, false); - await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await SearchIndexAsync(putObject, false); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags, dbObject.Tags); return dbObject; } @@ -118,7 +115,7 @@ namespace AyaNova.Biz transaction = await ct.Database.BeginTransactionAsync(); try { - CustomerNote dbObject = await ct.CustomerNote.SingleOrDefaultAsync(m => m.Id == id); + CustomerNote dbObject = await GetAsync(id, false); if (dbObject == null) { AddError(ApiErrorCode.NOT_FOUND); @@ -165,7 +162,7 @@ namespace AyaNova.Biz public async Task GetSearchResultSummary(long id) { - var obj = await ct.CustomerNote.SingleOrDefaultAsync(z => z.Id == id); + var obj = await GetAsync(id); var SearchParams = new Search.SearchIndexProcessObjectParameters(); DigestSearchText(obj, SearchParams); return SearchParams; @@ -191,7 +188,7 @@ namespace AyaNova.Biz var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); //query for this batch, comes back in db natural order unfortunately - var batchResults = await ct.CustomerNote.Where(z => batch.Contains(z.Id)).ToArrayAsync(); + var batchResults = await ct.CustomerNote.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; foreach (CustomerNote w in orderedList) diff --git a/server/AyaNova/biz/CustomerServiceRequestBiz.cs b/server/AyaNova/biz/CustomerServiceRequestBiz.cs index 8a8fbdcc..4ebf8324 100644 --- a/server/AyaNova/biz/CustomerServiceRequestBiz.cs +++ b/server/AyaNova/biz/CustomerServiceRequestBiz.cs @@ -98,7 +98,7 @@ namespace AyaNova.Biz // internal async Task GetAsync(long id, bool logTheGetEvent = true) { - var ret = await ct.CustomerServiceRequest.SingleOrDefaultAsync(m => m.Id == id); + var ret = await ct.CustomerServiceRequest.AsNoTracking().SingleOrDefaultAsync(m => m.Id == id); if (logTheGetEvent && ret != null) await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); return ret; @@ -109,20 +109,18 @@ namespace AyaNova.Biz // internal async Task PutAsync(CustomerServiceRequest putObject) { - CustomerServiceRequest dbObject = await ct.CustomerServiceRequest.SingleOrDefaultAsync(m => m.Id == putObject.Id); + var dbObject = await ct.CustomerServiceRequest.SingleOrDefaultAsync(m => m.Id == putObject.Id); if (dbObject == null) { AddError(ApiErrorCode.NOT_FOUND, "id"); return null; } - CustomerServiceRequest SnapshotOfOriginalDBObj = new CustomerServiceRequest(); - 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; - await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); + + putObject.Tags = TagBiz.NormalizeTags(putObject.Tags); + putObject.CustomFields = JsonUtil.CompactJson(putObject.CustomFields); + await ValidateAsync(putObject, dbObject); if (HasErrors) return null; + ct.Replace(dbObject, putObject); try { await ct.SaveChangesAsync(); @@ -136,9 +134,9 @@ namespace AyaNova.Biz return null; } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); - await SearchIndexAsync(dbObject, false); - await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); - await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); + await SearchIndexAsync(putObject, false); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags, dbObject.Tags); + await HandlePotentialNotificationEvent(AyaEvent.Modified, putObject, dbObject); return dbObject; } @@ -151,7 +149,7 @@ namespace AyaNova.Biz { try { - CustomerServiceRequest dbObject = await ct.CustomerServiceRequest.SingleOrDefaultAsync(m => m.Id == id); + CustomerServiceRequest dbObject = await GetAsync(id, false); if (dbObject == null) { AddError(ApiErrorCode.NOT_FOUND); @@ -189,7 +187,7 @@ namespace AyaNova.Biz // internal async Task AcceptAsync(long csrId, long workorderId) //MIGRATE_OUTSTANDING waiting for workorder to be completed or at least have a customerid which it currently doesn't { - CustomerServiceRequest dbObject = await ct.CustomerServiceRequest.SingleOrDefaultAsync(m => m.Id == csrId); + var dbObject = await GetAsync(csrId, false); if (dbObject == null) { AddError(ApiErrorCode.NOT_FOUND, "id"); @@ -197,7 +195,7 @@ namespace AyaNova.Biz } throw new System.NotImplementedException("//MIGRATE_OUTSTANDING CustomerServiceRequestBiz::AcceptAsync - awaiting workorder completion "); -// WorkOrder w=null; + // WorkOrder w=null; //if (workorderId==0){WorkOrderBiz.GenerateWorkOrder()} //this is how it would work in theory @@ -233,33 +231,16 @@ namespace AyaNova.Biz // internal async Task RejectAsync(long csrId) { - CustomerServiceRequest dbObject = await ct.CustomerServiceRequest.SingleOrDefaultAsync(m => m.Id == csrId); + var dbObject = await GetAsync(csrId, false); if (dbObject == null) { AddError(ApiErrorCode.NOT_FOUND, "id"); return null; } - CustomerServiceRequest SnapshotOfOriginalDBObj = new CustomerServiceRequest(); - CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); + + //Nothing to validate as it just came from the db and rejecting doesn't require validation dbObject.Status = CustomerServiceRequestStatus.Declined; - await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); - if (HasErrors) return null; - try - { - await ct.SaveChangesAsync(); - } - catch (DbUpdateConcurrencyException) - { - if (!await ExistsAsync(dbObject.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, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); - await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); + await PutAsync(dbObject); return dbObject; } @@ -280,7 +261,7 @@ namespace AyaNova.Biz public async Task GetSearchResultSummary(long id) { - var obj = await ct.CustomerServiceRequest.SingleOrDefaultAsync(z => z.Id == id); + var obj = await GetAsync(id, false); var SearchParams = new Search.SearchIndexProcessObjectParameters(); DigestSearchText(obj, SearchParams); return SearchParams; @@ -370,7 +351,7 @@ namespace AyaNova.Biz var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); //query for this batch, comes back in db natural order unfortunately - var batchResults = await ct.CustomerServiceRequest.Where(z => batch.Contains(z.Id)).ToArrayAsync(); + var batchResults = await ct.CustomerServiceRequest.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; foreach (CustomerServiceRequest w in orderedList) @@ -459,7 +440,7 @@ namespace AyaNova.Biz if (jobData.ContainsKey("idList")) idList = ((JArray)jobData["idList"]).ToObject>(); else - idList = await ct.CustomerServiceRequest.Select(z => z.Id).ToListAsync(); + idList = await ct.CustomerServiceRequest.AsNoTracking().Select(z => z.Id).ToListAsync(); bool SaveIt = false; foreach (long id in idList) {