2012-04-06 2 views
2

나는 다음과 같은 데이터 모델이 있습니다핸들 탐색 속성

enter image description here

내가 추가 지원하기 위해 새 보고서를 필요로하는 WCF 서비스를 쓰고 있어요을 :

public bool CreateNewReport(Report report) 
    { 
     MyEntities context = new MyEntities(); 
     context.AddToReports(Report); 
     context.SaveChanges(); 
    } 

그래서 내 메서드는 클라이언트에서 만들어진 보고서 개체를 가져 와서 데이터 컨텍스트를 통해 데이터베이스에 추가합니다. (모든 구성원은 DataContract에 포함되어 있습니다)

내 질문에 관한 탐색 속성입니다.

  1. 클라이언트는 보내기 전에 사용자 개체를 만들어 새 보고서 개체에 넣어야합니까?
  2. 어떻게 접근하는 가장 좋은 방법입니까? 새로운 보고서를 삽입 할 때 ReportEntity
  3. UserId 필드를 추가하는 것이 좋습니다. 어떻게 새 보고서의 UserEntity 보고서 탐색 속성을 업데이트합니까?

감사합니다.

+1

한 쪽 메모 : 항상 다음을 사용하여 엔티티 컨텍스트를 사용하십시오. (var ctx = new MyEntities()) {...}'. 이것은 사용 된 모든 리소스를 해제하는 using 블록의 끝에 Dispose를 호출합니다 ... –

+0

@RicoSuter 좋은 점, 감사합니다. – Michael

답변

1

데이터베이스를 가져 오는 경우 탐색 속성 (그림의 속성)과 외부 ID 속성 (예 : 보고서 클래스에 User 및 UserID 속성이 있음)을 생성하십시오. 이렇게하면 클라이언트에 UserID를 설정하여 서버에 보내고 AddToReports ...을 추가 할 수 있습니다. 전체 사용자 객체를 보내면 엔티티 컨텍스트에 연결해야합니다. 그렇지 않으면 사용자가 다시 만들어집니다. . 기존 보고서의

public bool ChangeUserToNewReport(int userid, Report newReport) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     var user = context.Users.Single(u => u.ID = userid); 
     user.Report = newReport; 
     context.SaveChanges(); 
    } 
} 

:

public bool CreateNewReport(Report report) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     context.AddToReports(Report); 
     context.Users.Attach(report.User); 
     context.SaveChanges(); 
    } 
} 

사용자의 보고서를 변경하려면 (그러나 그것은 단지 ID로 사용자를 전송하는 것이 좋습니다) :

참조 된 사용자를 연결

public bool ChangeUserReport(int userid, Report existingReport) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     context.Reports.Attach(existingReport); 
     var user = context.Users.Single(u => u.ID = userid); 
     user.Report = existingReport; 
     context.SaveChanges(); 
    } 
} 

이것은 모델이 어떻게 보이는지 보여주는 샘플입니다. 연관 선을 두 번 클릭하여 대화 상자를 엽니 다. PersonPersonID 속성이 동일하다는 것을 알 수 있습니다. 이와 같이 모델을 만들면 VS에서 올바른 SQL을 생성해야합니다. enter image description here

+0

감사합니다. 제가 UserID foreign id 속성을 가지고 있다면 어떻게 할 수 있겠습니까? 당신이 제안한 보고서 수업 에서요? 사용자 테이블에서 새 보고서를 어떻게 알 수 있습니까? – Michael

+0

질문이 이해가 가지 않습니다. 'Report' 네비게이션 프로퍼티가 파생 된 데이터베이스에 이미 'ReportID' 외래 키가 있다고 가정합니다. 'ReportID'와'Report' 속성을 사용하면이 외래 키에 접근 할 수있는 두 가지 방법 밖에 없습니다 ('Report' 속성은 게으른 로딩을 지원합니다 ...) –

+0

죄송합니다. 저는 EF와 DB 지식이 새롭지 않으므로 미안 해요. 큰. 나는 당신이'UserEd'라는 이름의'ReportEntity'에 다른 속성을 추가해야한다고 말했고 (새로운'UserEntity'에 PK가 아닌), 새로운 보고서를 만들 때 그것을 업데이트해야합니다.이 방법은 내가 wouldnt User 개체를 만들고 보고서에서 클라이언트에서 보낼 때 그것을 캡슐화해야합니다. 올바른거야? 그 외에 나는 보고서 및 사용자와 일대일 관계가 있습니다 – Michael