2009-12-02 3 views
0

다른 테이블 인 CLASSES와 관련된 일대 다 테이블 인 STUDENTS와 같은 테이블이 있습니다. 콤보 상자에서 클래스 중 하나를 선택하는 것을 포함하여 새로운 학생의 의견을 받기 위해 ASP.Net 양식을 만들었습니다. 이것은 작지만 멀티 티어 앱이며 엔티티 프레임 워크를 사용하기 시작했습니다. 따라서 EF는 두 테이블에 대한 클래스를 생성했습니다. 제출시 STUDENT 객체를 만들고 삽입, 업데이트 등을 위해 데이터 컨트롤러에 전달합니다.엔티티 프레임 워크를 사용하는 마스터/세부 사항

STUDENTS 테이블에 CLASSES 테이블이 CLASSES 테이블에 있습니다. 오늘 날 스튜 디언 스에 인서트를 할 때 콤보 상자에서 SelectedValue를 가져 와서 ClassId 필드에 붙여 넣었습니다. 그러나 EF의 경우 STUDENT 오브젝트에는이 ID 필드가 없습니다. 대신 CLASS 필드가 있는데 이는 해당 클래스의 전체 인스턴스입니다. 새 STUDENT 오브젝트가 빌드 될 때, CLASS 필드는 널입니다. 사용자가 콤보에서 선택한 클래스로 채 웁니다.

나는 null을 남겨 둘 수 없으며 거기에 ID를 넣을 수 없습니다. 그 클래스 레코드를 가져 와서 사용하려고 시도했지만 두 개의 다른 컨텍스트에서 같은 개체를 사용할 수 없다는 오류가 발생했습니다. 내가 여기서 정말로해야 할 일은 무엇인가?

답변

2

당신은 ClassReference를의 EntityKey 속성을 설정할 수 있습니다

Student.ClassReference.EntityKey = new EntityKey("myModel.ClassSet", "ID", classId); 

편집을

이있다 (나는 지금 그것을 확인할 수 없습니다,하지만 작동합니다) 학생을 추가하는 방법 :

newStudent.BClassReference.EntityKey = new EntityKey("FormsEntities.BClasses", "BClassId", 13); 

FormsEntities fe = new FormsEntities(); 
fe.AddToStudents(newStudent); 
fe.SaveChanges(); 
+3

EF4에서 FK Id가 노출되고 EntityKey를 사용할 필요가 없다는 것을 추가하고 싶습니다. – jfar

+0

LukLed, 당신의 방법은 나를 위해 일했습니다. 저는이 방법을 좋아합니다. 왜냐하면 완전한 레코드를 얻기 위해 DB로 돌아갈 필요가 없기 때문입니다. 나는 이미 PK를 알고 있고, 나는 그것을 사용하고 싶다. 나는 당신의 코드에서 정확히 무슨 일이 일어나고 있는지 모르겠다. 전에 newStudent.BClass 객체를 초기화하고 작동하지 않는 새로운 엔티티 키를 추가하려고했습니다. 오브젝트 이름 끝에 "참조"라는 단어를 추가하는이 등록 정보는 BClass 등록 정보가 널 (NULL)인지 여부에 관계없이 작업을 완료 한 것으로 보입니다. 또한 크레이그 (Craig)의 다른 솔루션에서와 마찬가지로, 모두 하나의 상황에서 발생해야합니다. –

+0

EntityReference는 아직로드되지 않은 탐색 속성에서 작동하는 데 사용됩니다. 또한 IsLoaded 속성과 DB에서 Entity를 가져 오는 데 사용되는 Load() 메서드를 살펴보아야합니다. http://msdn.microsoft.com/en-us/library/bb297956.aspx – LukLed

2

쉬운 일을 시작하면 어떨까요?

using (var fe = new FormsEntities()) 
{ 
    newStudent.BClass = fe.BClasses.Where(bc => bc.BClassId == 13).First(); 
    fe.AddToStudents(newStudent); 
    fe.SaveChanges(); 
} 

기본 작동을 얻을 때까지 EntityKey과 함께 주변을 놀리지 마십시오. 저장을 "최적화"하는 것이 대부분 시간 낭비라고 생각합니다.

+0

다른 구문을 사용하여이 초기에 시도했습니다. 여기서 그것을 검색하여 newStudent 객체에 넣습니다. 저장하려고 할 때 개체가 이미 다른 컨텍스트에 연결되어 있다는 예외가 있습니다. 구문을 사용하여 다시 시도해 보겠습니다. 아마도 더 나은 행운을 누릴 수 있습니다. 나는 저장을 "최적화"하는 것에 관해 모른다. 나는 그저 구원을 원한다. –

+0

당신은 아마도> 1 컨텍스트 ('FormsEntries' 인스턴스)를 사용했을 것입니다. 가능할 때마다 한 번에 하나씩 만 사용하는 것이 좋습니다. 일을 훨씬 단순하게 만듭니다. –

+0

크레이그, 당신의 방법이 효과가있었습니다. 나는 왜 내 것이 아니라고 생각했다. 나는 같은 생각을 가지고 있었지만 분리 된 이유로 다른 기능으로 GET을하고 있었다. 내가 이것을했을 때 나는 아주 새로운 문맥을 사용했다. 그래서 "GetClass (id)"를 사용하여 BClass를 가져온 다음 다른 컨텍스트를 사용하여 Student를 저장하는 다른 함수를 호출합니다. 나는 "엔티티 객체가 IEntityChangeTracker의 여러 인스턴스에 의해 참조 될 수 없다."문맥 (FormsEntities fe)이 같은 장소에서 구문이나 광산을 사용하면 모든 것이 잘 작동합니다. 도움을 주셔서 감사합니다. –

관련 문제