3

Entity Framework 4 CTP 5에 대한 문제가 있습니다. LINQ에서 SQL로 처리하는 것이 더 좋지만 EF 4 사용을 고집합니다. Code-First 기능 때문입니다.Entity Framework 4 (CTP 5)는 LINQ-to-SQL과 비교하여 부적절하게 쿼리합니다

태그 제품을 상상해 (또는 무엇이든에 많은 관계로 일) :

그래서 여기 내 문제입니다. 그리고 tblTags은 일부를 삭제하고 사용자가 한 번에 일부 태그를 삽입함으로써 변경됩니다 (사용자가 완전히 다르게 변경할 수 있음). LINQ to SQL은 EF 4와 달리 완벽하게 놀라운 것을 관리합니다 :

(영문 일 수 있음) 간단한 생각이지만 모든 기존 태그를 삭제하고 새로운 태그를 삽입 할 수 있습니다. SQL에

LINQ :

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에서 먼저 DB에서 삭제하지 않고 이전 항목을 업데이트하려고 시도합니다. 그런 다음 여분의 태그를 삽입하십시오.
  • 그러나 엔티티 프레임 워크에서
  • , 그것은 만들고 각 " 제거"를 각각 " 을 추가"당 하나 개의 쿼리 당 하나 개의 쿼리를 보냅니다.

EF는 업데이트를 계산하지 않지만 지시 한대로 처리합니다 (더 이상 필요 없음). SQL을 통해 많은 쿼리를 보낼 것이므로 아무 이유없이 내 자동 번호 열이 증가합니다.
두 번째 문제에 대한 논리를 수행 할 수 있다는 것을 알고 있습니다. 그런 다음 LINQ to SQL을 선호합니다.
하지만 SQL에 대한 쿼리 전달에 대해서는 아무 것도 할 수 없습니다. 그것은 최적화되지 않은 것으로 들립니다.

내가 원하는 것 코드 우선은 LINQ to SQL에 현재있는 이러한 기능 (커밋 전에 내용 계산)과 결합됩니다. 어떠한 제안? EF 코드에서 잘못된 것이 있습니까? 아니면 RTM 버전의 커밋 변경 사항에서 LINQ to SQL과 같을까요? 이 동작에 동의하지 않는 경우

UPDATE
그렇게 말과 코멘트를 남겨주세요.
자세한 정보가 필요하면 일부 정보를 제공해주십시오.

이 게시물을 업데이트합니다. 아직 답변을 기다리고 있습니다. 시간 내 줘서 고마워.

답변

1

이에 대한 배치 작업을 사용한다 :

SaveChanges(SaveChangesOptions.Batch); 

msdn에서 더 읽기.

관련 문제