From 0a3db92c60c2369dc6e6afcee9e8bebbe23217e2 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Mon, 30 Jan 2023 10:23:18 -0600 Subject: [PATCH] fix schedule copy (#1142) --- .../Commands/CopyProgramScheduleHandler.cs | 50 ++++++++----------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/ErsatzTV.Application/ProgramSchedules/Commands/CopyProgramScheduleHandler.cs b/ErsatzTV.Application/ProgramSchedules/Commands/CopyProgramScheduleHandler.cs index 48e9efe18..c836a8ac0 100644 --- a/ErsatzTV.Application/ProgramSchedules/Commands/CopyProgramScheduleHandler.cs +++ b/ErsatzTV.Application/ProgramSchedules/Commands/CopyProgramScheduleHandler.cs @@ -3,7 +3,6 @@ using ErsatzTV.Core.Domain; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; using static ErsatzTV.Application.ProgramSchedules.Mapper; namespace ErsatzTV.Application.ProgramSchedules; @@ -38,44 +37,26 @@ public class CopyProgramSchedule request, CancellationToken cancellationToken) { - var clone = new ProgramSchedule(); - await dbContext.AddAsync(clone, cancellationToken); - - clone.Name = request.Name; - clone.RandomStartPoint = schedule.RandomStartPoint; - clone.ShuffleScheduleItems = schedule.ShuffleScheduleItems; - clone.TreatCollectionsAsShows = schedule.TreatCollectionsAsShows; - clone.KeepMultiPartEpisodesTogether = schedule.KeepMultiPartEpisodesTogether; + DetachEntity(dbContext, schedule); + schedule.Name = request.Name; // no playouts, no alternates - clone.Playouts = new List(); - clone.ProgramScheduleAlternates = new List(); + schedule.Playouts = new List(); + schedule.ProgramScheduleAlternates = new List(); - // clone all items - clone.Items = new List(); foreach (ProgramScheduleItem item in schedule.Items) { - PropertyValues itemValues = dbContext.Entry(item).CurrentValues.Clone(); - itemValues["Id"] = 0; - - ProgramScheduleItem itemClone = item switch - { - ProgramScheduleItemFlood => new ProgramScheduleItemFlood(), - ProgramScheduleItemDuration => new ProgramScheduleItemDuration(), - ProgramScheduleItemMultiple => new ProgramScheduleItemMultiple(), - _ => new ProgramScheduleItemOne() - }; - - await dbContext.AddAsync(itemClone, cancellationToken); - dbContext.Entry(itemClone).CurrentValues.SetValues(itemValues); - - itemClone.ProgramScheduleId = 0; - itemClone.ProgramSchedule = clone; + DetachEntity(dbContext, item); + item.ProgramScheduleId = 0; + item.ProgramSchedule = schedule; } + await dbContext.ProgramSchedules.AddAsync(schedule, cancellationToken); + await dbContext.ProgramScheduleItems.AddRangeAsync(schedule.Items, cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); - return ProjectToViewModel(clone); + return ProjectToViewModel(schedule); } private static async Task> Validate( @@ -110,4 +91,13 @@ public class return (result1, result2).Apply((_, _) => request.Name); } + + private static void DetachEntity(DbContext db, T entity) where T : class + { + db.Entry(entity).State = EntityState.Detached; + if (entity.GetType().GetProperty("Id") is not null) + { + entity.GetType().GetProperty("Id")!.SetValue(entity, 0); + } + } }