2012-09-19 3 views
2

이 항목에 대한 많은 질문 중 내 상황과 일치하지 않는 항목이 있습니다. 큰 데이터 모델이 있습니다. 어떤 경우에는 필드 중 일부만 UI에 표시해야하기 때문에 필요한 모든 열을 가져 오는 Entity SQL 쿼리로 모든 항목을 가져 오는 LINQ to Entity 쿼리를 바꾼 경우 Type 생성자를 사용하여 가져 왔습니다. 다음과 같이 DbDataRecord가 아닌 엔터티가 반환됩니다.Entity Framework 5 SaveChanges가 작동하지 않음, 오류가 발생하지 않음

SELECT VALUE MyModelNameSpace.INCIDENT(incident.FieldA, incident.FieldB, ...) FROM ... AS ... 

이렇게하면 UI에 필드가 표시되고 표시됩니다. 변경을하면 UI 요소 밖으로 탭을 이동하면 엔티티 모델로 변경됩니다. 그러나 SaveChanges를 수행하면 변경 내용이 데이터베이스에 유지되지 않습니다. 로그에 오류가 표시되지 않습니다. 지금은 매우 신중하게 다음과 같이 전체 개체를 검색하는 엔티티 SQL 쿼리와 함께 위의 쿼리를 대체 할 경우 :

SELECT VALUE incident FROM MyDB.INCIDENTs AS incident... 

변경 사항은 데이터베이스에 유지합니까! 따라서 테스트에서 필자는 엔티티의 모든 열에 이름이 지정된 것과 같은 다른 쿼리를 만들었습니다.이 쿼리는 두 번째 Entity SQL 쿼리와 정확히 일치해야합니다. 그러나 그것은 데이터베이스에 대한 변경 사항을 유지하지 못했습니다. 나는 다음과 같이 추적을 시작하기 위해, PreserveChanges에 반환 된 결과에 MergeOption 설정을 시도했습니다

:

incidents.MergeOption = MergeOption.PreserveChanges; 

하지만 그 효과가 없습니다. 그러나 Entity Sql을 사용하여 전체 엔터티를 검색하는 것이 변경 사항을 계속 유지하는 경우 필드의 하위 집합을 검색 할 때 다르게 동작하는 것은 어떤 논리 목적입니까? 이것이 버그인지 궁금하네요?

+0

난 그냥 코드에서'Incident'를 newing 또는에서 그것을 가져 오는대로 같은 차이 _think_ :

코드는 (이 아마 더 적은 단계로 수행 될 수 있지만, 나는이 작품을 알고)이었다 컨텍스트의 콜렉션 첫 번째 인스턴스는 컨텍스트가 알지 못하기 때문에 추적되지 않습니다. –

+0

관련성이 없지만 반환 된 값인 ObjectQuery 이 CollectionViewSource 개체에 전달되었음을 알리는 것을 잊었습니다. 이것이 데이터가 필드를 채우는 이유이며, 변경 사항은 엔티티 필드로 다시 푸시됩니다. – whandley

+0

감사합니다. 하지만 그게 사실이라면 상황을 어떻게 알릴 수 있습니까? 나는 MergeOption.PreserveChanges가 그것을 보장 할 것이라고 생각했지만 효과가 없다. – whandley

답변

0

Gert가 정확했다면 엔티티가 첨부되지 않은 것이 문제였습니다. Dank U wel, Gert! Ik는 ervan verbluft였습니다! 전체 솔루션을 보여주기 위해 약간의 세부 사항을 추가하고 싶었습니다. 기본적으로 ObjectContext에는 Attach 메서드가 있으므로 생각하면됩니다. 그러나 Entity SQL select 문에서 열의 이름을 지정하고 내가 한 것처럼 Type을 사용하여 개체를 만들면 EntityKey가 만들어지지 않고 ObjectContext.Attach가 실패합니다. EntityKey를 삽입하려고 시도한 후에 자신을 생성 한 후에 Entity Framework 4에 추가 된 ObjectSet.Attach를 발견했습니다. 누락 된 경우 실패하는 대신 EntityKey가 생성됩니다. 좋은 접촉.

var QueryString = "SELECT VALUE RunTimeUIDesigner.INCIDENT (incident.INCIDENT_NBR,incident.LOCATION,etc" 
ObjectQuery<INCIDENT> incidents = orbcadDB.CreateQuery<INCIDENT>(QueryString); 
incidents.MergeOption = MergeOption.PreserveChanges; 
List<INCIDENT> retrievedIncidents = incidents.ToList<INCIDENT>(); 
orbcadDB.INCIDENTs.Attach(retrievedIncidents[0]); 
iNCIDENTsViewSource.Source = retrievedIncidents; 
관련 문제