Как заставить EF выполнять вставку запросов в правильном порядке?

0

Я использую 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 отправляется в БД, я вижу его в журнале. Таким образом, проблема по-прежнему сохраняется, но исключение отличается (ограничение внешнего ключа завершается с ошибкой).

Спасибо за помощь, Майкл

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

  • 0
    Какая версия EF?
  • 0
    Как я сейчас написал, я думаю, что это версия 1.
Теги:
entity-framework

2 ответа

0
Лучший ответ

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

Просто, если кто-то еще будет борется...

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

2

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

Или:

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

или

b.Ds.Add(new D());
  • 0
    b.B_ID - это ключевой столбец, но это значение пригодно для использования, так как я на самом деле устанавливаю его после создания B (это вечеринка "...", я собираюсь изменить исходное сообщение, извините)
  • 0
    @Michael: Вы попробовали одно из предложений, которые я сделал? Я не говорю, что ваш путь не должен работать, но мне любопытно, позволит ли один из этих вариантов вставить их в один пакет.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню