Проблема с внешним ключом при вложенной вставке linq в sql

#c# #asp.net #linq-to-sql #insert #foreign-keys

#c# #asp.net #linq-to-sql #вставить #внешние ключи

Вопрос:

У меня интересная проблема, я пытаюсь вставить вложенные данные, используя l2s, все в порядке, если я не пытаюсь вставить объект с fk также в корневой родительский элемент, пример схемы:

Все идентификаторы являются идентификаторами pk

Тестируемый код:

  Models.testdbDataContext db = new Models.testdbDataContext();

        List<string> data = new List<string>();

        data.Add("kkkk1");
        data.Add("kkkk2");
        data.Add("kkkk3");
        data.Add("kkkk4");
        data.Add("kkkk5");

        foreach (var item in data)
        {
            nested1 n1 = new nested1();
            n1.name1 = "test1";

            db.nested1.InsertOnSubmit(n1);

            foreach (var item2 in data)
            {
                nested2 n2 = new nested2();
                n2.name2 = "test2";

                n1.nested2.Add(n2);

                foreach (var item3 in data)
                {
                    nested3 n3 = new nested3();
                    n3.name3 = "test3";

                    n2.nested3.Add(n3);


                }
            }
        }

        db.SubmitChanges(); <-- error here (duh)
  

Ошибка: «Оператор INSERT конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА «FK_nested3_nested1». Конфликт произошел в базе данных «TESTDB.MDF», таблице «dbo.nested1», столбце «id».
Оператор был завершен «.

Проблема в том, что если таблица nested3 также имеет идентификатор fk для nested1, возникает эта ошибка, когда nested3 имеет fk только для своего родительского идентификатора nested2, проблемы нет, похоже, что l2s не может получить идентификатор от nested1 только от предыдущего родителя.

Итак, как это преодолеть?

Ответ №1:

Хорошо, я нашел решение.

Если есть другой fk, вам нужно добавить текущие вложенные данные также в родительскую коллекцию, таким образом, l2s получит столько значений идентификатора fk, сколько вам нужно.

Для этого примера это будет:

 n1.nested3.Add(n3);
  

После n2.nested3.Add(n3);

Комментарии:

1. Спасибо — я боролся с этим уже пару часов … только что нашел этот пост — и это сразу решило мою проблему … хотя немного по-другому, не нужно было делать .Add(), просто присвоил внешнему объекту object значение, которое представляло объект 🙂