Как заставить EF выполнять вставку запросов в правильном порядке? - PullRequest
0 голосов
/ 23 августа 2010

Я использую 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 (объекты в «...» участвуют в отношениях «BD». Найдено 0 связанных «B». Ожидается 1 «B»)? Потому что, когда я пропускаю последнюю команду (вставка D, потомок B), она работает нормально, а когда я запускаю вставку после нее (т. Е. В новой транзакции), она также отлично работает.

Может ли быть так, что EF слепо вставляет элементы в случайном порядке, но замечает для себя, что этого не может быть? Или я подхожу к проблеме совершенно неправильно?

EF версия: у меня .NET FX 3.5 SP1, так что, насколько я знаю, это версия 1.

Обновление: Очень извините, отследил ошибку до ошибки, которую я сделал, так что теперь ошибка не возникает на уровне EF (за исключением того, что я сказал выше), но на самом деле вставка для элемент chidl отправляется в БД, я вижу это в журнале. Таким образом, проблема все еще сохраняется, но исключение другое (ограничение внешнего ключа не выполняется).

Спасибо за вашу помощь, Michael

(отредактировано для ответа на комментарии)

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Представляет ли b.B_ID столбец идентификаторов (или другой идентификатор, автоматически сгенерированный базой данных)?Если это так, то он не будет иметь полезного значения до тех пор, пока не произойдет его операция вставки.В этом случае вам придется установить одну сторону отношения, используя ссылку на объект, а не идентификатор базы данных.

Либо:

C.Ds.Add(new D() { B = b });

, либо

b.Ds.Add(new D());
0 голосов
/ 23 августа 2010

После нескольких часов попыток, я думаю, у меня был прорыв.Это требует дополнительного тестирования, но я обнаружил, что EF может обрабатывать отношения INT гораздо лучше, чем VARCHAR (n).Я собираюсь обновить этот ответ, как только я его узнаю.

Хотя кто-то еще тоже будет бороться ...

Изменить : Да, определенноДля моей конфигурации (EF1 / MySQL) EF ставит дочерние INSERT первыми, если первичным ключом родительского (и внешнего ключа дочернего) является VARCHAR.Я пытался с VARCHAR (120) и VARCHAR (255), ни один не работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...