Entity Framework 4 (CTP 5) неразумно запрашивает по сравнению с LINQ-to-SQL - PullRequest
3 голосов
/ 14 января 2011

У меня проблема с 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 " и один запрос для каждого " add ".

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

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

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

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

1 Ответ

1 голос
/ 08 июля 2011

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

SaveChanges(SaveChangesOptions.Batch);

Подробнее на msdn .

...