2009-08-06 2 views
1

Ive는 Entity Framework를 사용하여 SQL 2008 데이터베이스와 상호 작용하는 Model View ViewModel 패턴에 따라 WPF 응용 프로그램을 얻었습니다.Entity Framework에서 관계/외래 키 변경 - 유지되지 않음

문제 :

내 문제는 내가 EF를 사용하여, 데이타베이스에 외래 키 값을 변경할 수 없습니다입니다. 사이트와 키의 두 엔티티가 있습니다. 사이트는 많은 키를 가질 수 있습니다. 한 사이트에서 다른 사이트로 키를 이동하고 싶습니다. 나는이 사용하는 다음 코드를 할 노력하고있어 :

응용 프로그램의 나머지 부분이 변경합니다 (반영으로 내가 그것은 메모리 모두에 나타납니다

괜찮를 관찰 한 어떤

keyToMove.Site = newSite; 
dataAccess.SaveChanges(); // this method just does: this.entities.SaveChanges(); 

키가 새 사이트 아래에 나타납니다). 그러나 데이터베이스의 외래 키는 변경되지 않으며 응용 프로그램을 닫고 다시 시작하면 모든 변경 내용이 손실됩니다.

"keyToMove.Site = newSite;"다음에 keyToMove, newSite 및 이전 Site 인스턴스의 EntityState 값은 모두 "변경되지 않음"이며 올바른 수는 없습니다. 또한 SaveChanges는 2를 돌려 주며, 이는 더 이상 나를 혼란스럽게합니다.

set 
{ 
    ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Site>("CmsModel.SiteKeyAssociation", "Site").Value = value; 
} 

SQL 프로파일 업데이트를 닮은 아무것도에만 DB 엔진에 매우, 매우 긴 전송되지 않습니다 것을 보여줍니다

"사이트"속성에 대한 세터 구현은 내 모델에서 다른 탐색 속성처럼 보이는 고르다. 조건에 따라 다른 엔티티에서 "주요"엔티티 상속 효과

있을 수

것들 열 중 하나에 적용 하였다.

내 데이터 액세스 클래스 인스턴스 (예 : "dataAccess")에 대한 참조로 일부 데이터 액세스를 수행하려는 ViewModels을 제공하기 위해 AutoFac IOC 컨테이너를 사용하고 있습니다.

ObjectContext 인스턴스는이 클래스의 멤버입니다 (주석에 "this.entities"로 표시).

dataAccess 인스턴스는 Singleton Scoped이므로보기 모델 e.i에서 하나의 인스턴스 만 공유해야합니다. "keyToMove"와 "newSite"둘 다 동일한 컨텍스트에 연결됩니다.

이 게시물의 길이는 죄송합니다.하지만 여기에 무슨 일이 벌어지고 있는지 전혀 알지 못하고 가능한 한 많은 세부 정보를 제공하려고했습니다. 추가 정보가 도움이되는지 물어보십시오.

미리 감사드립니다.

+0

yourModel.Designer.cs의 속성 setter을 통해 디버그 및 확인 this.ReportPropertyChanged을()가 호출된다. –

+0

그렇지 않습니다. setter 구현은 다른 탐색 속성과 비슷합니다 (위의 편집 참조). – andrej351

+0

... 우연히 머리가 빨리 빠져 나와 여기서 빠져 나올 수 있으니, 제발 여기에 무슨 일이 벌어 질지 상상해보십시오. – andrej351

답변

1

나는 스스로 엔티티 프레임 워크를 스스로 가르치는 중이므로 질문의 요점을 놓칠 수도 있고 확실히 전문가가 아닙니다. 그러나, 그것이 나 자신을 통해 일해야만하는 문제가 될 수도 있습니다.

"newSite"변수를 작성하는 위치에 코드를 게시하지 않았지만 EF에서 외래 키를 설정할 때 Linq에서와 다른 방법으로 또는 데이터베이스에서 작업하는 것과 다르게 수행합니다.EF를 사용하면 개체에 설정할 외부 키 값을 IN으로 선택하고 설정해야합니다.

이 작동하지 않습니다

NewSite = Site.CreateSite("PrimaryKeyValue"); 
keyToMove.Site = NewSite; 

는 대신에, 당신은 같은 것을 할 :

NewSite = MyEntities.Site.Where(site=>site.PrimaryKey==PrimaryKeyValue) 
           .FirstOrDefault(); 
keyToMove.Site = NewSite; 

을 내가 질문을 이해 바랍니다!

감사합니다, 마이크

+0

이것은 사실입니다; EF는 변경된 것으로 생각되는 속성 만 업데이트합니다. DB에서 keyToMove를 구체화하면 자동으로 수행됩니다. 스스로 새롭게 작성한 경우 변경 사항이 감지 될 수 있도록 컨텍스트에 연결하기 전에 이전 사이트를 설정해야합니다. –

관련 문제