@Prorom-exe
.NET developer

Где нарушение внешнего ключа?

Есть таблица в бд, в ней есть дерево объектов. При попытке добавить запись выдает "нарушение ограничений внешнего ключа". Когда добавляешь вручную все нормально

Часть модельки
public int? ParentId { get; set; }
 public Good Parent { get; set; }
 public virtual ICollection<Good> LinkedGoods { get; set; }


builder.Entity<Good>().HasOne(x => x.Parent).WithMany(x => x.LinkedGoods).HasForeignKey(x => x.ParentId).OnDelete(DeleteBehavior.SetNull);


Сначала создаю главный объект, сохраняю и передаю сюда его Id и кол-во дочерних товаров
private async Task<OkResult> CreateLinkedItems(int parentId,int linkQuantity)
        {
            var good = await _db.Goods.FindAsync(parentId);
            good.Id = 0;
            for (int i = 0; i < linkQuantity; i++)
            {
                (var code, var number) = GetCode(good.CategoryId, good.HasDefects);
                
                 good.Code = code;
                 good.Number = number;
                good.ParentId = good.Id;
               
                _db.Goods.Add(good);
                _db.SaveChanges();
            }
            return Ok();
        }

P.S данные проверял вручную, ошибка именно в ParentId
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
@Prorom-exe Автор вопроса
.NET developer
Проблема была в том, что DbContext отслеживает этот объект. И есть два варианта решения AsNoTraking() либо ручками прописать создание нового объекта
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Sumor
В принципе код for странный - i внутри цикла не используется.
что-то видимо в цикле должно создаваться, но пока не создаётся.

good.Id = 0, а затем good.ParentId = good.Id; ParentId точно не может быть установлен в 0, так как такого id не может быть.

Видимо нужно внутри for создать новый goodNew и с ним работать внутри цикла, например goodNew.ParentId = good.Id
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы