Entity Framework 4 (CTP 5) неразумно запрашивает по сравнению с LINQ-to-SQL

У меня проблема с Entity Framework 4 CTP 5, и я понимаю, что LINQ to SQL справляется с ней лучше, чем это, но я настаиваю на использовании EF 4 из-за его функции Code-First.

Итак, вот моя проблема:

Представьте себе продукты с его тегами (или что-то еще с отношением один ко многим). И tblTags будет изменяться, удаляя некоторые и вставляя некоторые теги за раз пользователем (и пользователь может изменить их совершенно по-другому). Поэтому, на мой взгляд, мы можем просто удалить все старые теги и вставить новые (самое простое), хотя это простая идея, LINQ to SQL прекрасно справляется с этим, в отличие от EF 4. Коды для сравнения с LINQ следующие:

LINQ to SQL:

Dim oldTags = ctx.Tags.Where(Function(m) m.ProductID = pID)
Dim newTags = 'from user input, like from the model which was posted, like in MVC'

ctx.Tags.DeleteAllOnSubmit(oldTags)
ctx.Tags.InsertAllOnSubmit(newTags)

ctx.SubmitChanges()

EF 4 CTP5:

Dim oldTags = ctx.Tags.Where(Function(m) m.ProductID = pID)
Dim newTags = 'from user input, like from the model which was posted, like in MVC'
For Each item In oldTags
    ctx.Tags.Remove(item)
Next
For Each item In newTags
    ctx.Product.Add(item)
Next
ctx.SaveChanges()

Я пытаюсь сказать следующее:

  • В LINQ to SQL он сначала попытается обновить старые (вместо удаления их из БД). Затем вставьте дополнительные теги.
  • Но в Entity Framework он создает и отправляет по одному запросу для каждого «remove» и по одному запросу для каждого «добавить».

EF не рассчитывает обновления, но выполняет то, что ему сказано (не более того). он будет отправлять множество запросов через SQL, поэтому он будет поднимать мой столбец с автоматическим номером без всякой причины.
Я знаю, что могу выполнить некоторую логику для второй проблемы, поэтому я предпочитаю LINQ to SQL таким образом.
Но я ничего не могу сделать с запросами, передаваемыми в SQL. Звук не оптимизирован.

Я хочу, чтобы Code-First сочетался с функциями, которые в настоящее время есть в LINQ to SQL (расчет данных перед фиксацией). Любое предложение? Я сделал что-то не так в коде EF? Или это будет похоже на LINQ to SQL при фиксации изменений в версии RTM?

ОБНОВЛЕНИЕ
Если вы не согласны с таким поведением, сообщите об этом и оставьте комментарий.
И если вам нужна дополнительная информация, скажите мне, чтобы я ее предоставил.

Я обновляю этот пост, потому что все еще жду ответа. Спасибо за ваше время.


person GtEx    schedule 14.01.2011    source источник


Ответы (1)


Для этого следует использовать пакетную операцию:

SaveChanges(SaveChangesOptions.Batch);

Дополнительные сведения см. На странице msdn.

person Paul    schedule 07.07.2011