Внесение изменений в запись со связью "многие-ко-многим"
Есть таблицы 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;
}
}
}
Возникает две проблемы:
- При изменении создаются дубли тегов
- Не удаётся удалить "старые" записи из FeedBackFeedBackTag