Я использую Entity Framework с сервером MySQL, потому что хочу иметь возможность делать приятные и легкие запросы LINQ снова в моей базе данных MySQL. У меня очень простая проблема, и я разочарован, потому что не могу поверить, что EF совершает такую ужасную ошибку.
Чтобы упростить, у меня есть родительский и дочерний классы, и я хочу выполнить две вставки в одной транзакции.
Чтобы продемонстрировать: у меня есть A, B, C и D. A является родителем B и C, B и C являются родителями D (это должно быть так).
Я делаю следующее:
B b = new B() { B_ID = 1 };
A.Bs.Add(b);
C.Ds.Add(new D() { B_ID = b.B_ID } );
Я делаю это так, потому что все это происходит внутри класса C. Почему я получаю UpdateException (Entity в '...' участвуют в 'BD' отношениях. 0 связанных "B" были найдены. Ожидается 1 'B')? Потому что, когда я оставляю последнюю команду (вставляя D, дочерний элемент из B), она работает нормально, и когда я потом выдаю вставку (т.е. В новой транзакции), она отлично работает.
Может ли быть, что EF слепо вставляет элементы в случайном порядке, но замечает для себя, что этого не может быть? Или я совершенно неправильно подхожу к проблеме?
Версия EF: У меня есть .NET FX 3.5 SP1, поэтому из того, что я знаю, это версия 1.
Обновление: Очень жаль, отследила ошибку до ошибки, которую я сделал, поэтому теперь ошибка не возникает на уровне EF (с исключением, о котором говорилось выше), но на самом деле INSERT для элемента chidl отправляется в БД, я вижу его в журнале. Таким образом, проблема по-прежнему сохраняется, но исключение отличается (ограничение внешнего ключа завершается с ошибкой).
Спасибо за помощь, Майкл
(отредактировано для ответа на комментарии)
После нескольких часов попыток я думаю, что у меня был прорыв. Это требует еще нескольких тестов, но я обнаружил, что EF может обрабатывать отношения INT намного лучше, чем VARCHAR (n). Приступая к обновлению этого ответа, как только я это знаю.
Просто, если кто-то еще будет борется...
Изменить: Да, конечно. Для моей конфигурации (EF1/MySQL) EF сначала вводит дочерние INSERT, если первичный ключ родителя (и внешний ключ дочернего элемента) является VARCHAR. Я пробовал с VARCHAR (120) и VARCHAR (255), никто не работал.
Обозначает ли b.B_ID
столбец идентификатора (или другой идентификатор, который автогенерируется базой данных)? Если это так, то оно не будет иметь полезной стоимости до тех пор, пока не произойдет его операция вставки. В этом случае вам нужно будет установить одну сторону отношения, используя ссылку на объект, а не идентификатор базы данных.
Или:
C.Ds.Add(new D() { B = b });
или
b.Ds.Add(new D());