Внесение изменений в запись со связью "многие-ко-многим"

Есть таблицы FeedBack и FeedBackTags связанные через FeedBackFeedBackTag связью "многие-ко-многим". Пытаюсь вносить изменения вот таким методом:

    public async Task<Result<int>> EditFeedBackAsync(Models.FeedBack.FeedBack feedBack)
{
    if (feedBack.SelectedTypeList != null)
    {
        feedBack.TypeFlags = (TypeFlags)feedBack.SelectedTypeList?.Sum();
    }

    if (feedBack.BrandsSelected != null)
    {
        feedBack.Brand = (Brand)feedBack.BrandsSelected?.Sum();
    }

    var mapResult = _mapperProvider.CreateMapByProfile<Models.FeedBack.FeedBack, FusionDatabase.Models.FeedBack, FeedBackProfile>(feedBack);

    if (mapResult.HasError)
    {
        return new ErrorResult<int>(mapResult);
    }

    var mappedFeedBack = mapResult.ResponseObject;
    mappedFeedBack.Tags.ForEach(x => x.Id = 0); //если не обнулять id, возникает ошибка, но так создаются дубли тегов в FeedBackTags

    await _feedBackRepository.Clear(feedBack.Id); //пытаюсь удалять "старые" записи из FeedBackFeedBackTag, но они не удаляются
    return await _feedBackRepository.SaveItemWithRelationshipAsync(mappedFeedBack);
}

public async Task<Result> Clear(int id)
{
    try
    {
        var feedBack = await FusionContext.FeedBack.
            Include(x => x.Tags).AsNoTracking().FirstOrDefaultAsync(x => x.Id == id);
        feedBack.Tags?.Clear();
        await FusionContext.SaveChangesAsync();

        return new SuccessResult();
    }
    catch (Exception exception)
    {
        Logger.LogError(exception.Message, exception.StackTrace);
        return new ErrorResult<FeedBack>(exception.Message);
    }
}

 public virtual async Task<Result<int>> SaveItemWithRelationshipAsync(T? entity)
 {
     try
     {
         if (!await TryConnect())
         {
             return new ErrorResult<int>(ErrorTypes.DbConnectError);
         }

         if (entity == null)
         {
             return new ErrorResult<int>("Сохранение пустого объекта невозможно");
         }

         var context = FusionContext.Set<T>();
         if (entity.Id == 0)
         {
             context.AttachRange(entity);
             var insertResult = await FusionContext.SaveChangesAsync();
             if (insertResult == 0)
             {
                 return new ErrorResult<int>(ErrorTypes.InsertError);
             }

             return new SuccessResult<int>(entity.Id);
         }

         try
         {
             if (!context.Any(e => e == entity))
             {
                 context.AttachRange(entity);
             }
         }
         catch (Exception exception)
         {
             Logger.LogError($"Указанная сущность уже отслеживается. {exception}", exception.StackTrace);
         }

         FusionContext.Add(entity);
         FusionContext.Entry(entity).State = EntityState.Modified;
         var result = await FusionContext.SaveChangesAsync();
         if (result == 0)
         {
             return new ErrorResult<int>(ErrorTypes.SaveEntityError);
         }

         return new SuccessResult<int>(entity.Id);
     }
     catch (Exception exception)
     {
         Logger.LogError(exception, exception.StackTrace);
         return new ErrorResult<int>(exception.Message);
     }
     finally
     {
         if (entity != null)
         {
             FusionContext.Entry(entity).State = EntityState.Detached;
         }
     }
 }

Возникает две проблемы:

  1. При изменении создаются дубли тегов
  2. Не удаётся удалить "старые" записи из FeedBackFeedBackTag

Ответы (0 шт):