Я получаю сообщение об ошибке
Нарушение ограничения PRIMARY KEY
при попытке вызвать
_dbContext.Set<T>().Persist(_mapper).InsertOrUpdate(typeof(Category), model);
для сохранения рекурсивного дерева структура с использованием Automapper.
У меня есть эти 2 объекта данных, первичный ключ которых CategoryId
и ProjectId
.
public class CategoryTree //My DTO
{
public CategoryId {get;set;}
public ProjectId {get;set;}
public string Name { get; set; }
public List<Categery> Categories {get; set;}
}
public class Category //My Entity
{
public Guid CategoryId {get;set;}
public Guid ProjectId {get;set;}
public string Name { get; set; }
public List<Categery> Categories {get; set;}
public List<Topic> Topics {get; set;}
public Guid ParentCategoryId {get; set;}
}
Я добавил Automapper.Collections
и Automapper.EntityFrameworkCore.Collection
и включил конфиг для тех, кто в моей конфигурации маппера
cfg.AddCollectionMappers();
cfg.UseEntityFrameworkCoreModel<AKSContext>();
Я пробовал как с, так и без установки сравнения равенства
cfg.EqualityComparison((mod, ent) => (mod.CategoryId == ent.CategoryId && mod.ProjectId == ent.ProjectId))
Все отлично работает при первом сохранении, которое вставляет дерево и при втором сохранении первый узел не имеет дочерних элементов, и этот узел обновляется нормально, но второй узел создает исключение для нарушения первичного ключа первого дочернего элемента.
Другими словами Он может обнаружить, что это обновление для верхнего уровня, но предполагает, что это вставка для детей. Я предполагаю, что что-то упустил.