2014-11-12 2 views
0

작은 모델이지만 디자인 방법에 의문점이 있습니다.Entity Framework 6 코드 우선 : 특정 모델 디자인 구현

제 아이디어는 JobReport/Customer/Project의 세 가지 클래스를 갖는 것입니다. 범위는 Customer (고객) 및 Project (고객) (다른 페이로드 포함)를 선택하는 보고서를 채우는 것입니다.

내 디자인은 다음과 같습니다

Design 1

모델 :

public class EFDBContext : DbContext 
{ 
    public DbSet<JobReport> JobReport { get; set; } 
} 

내가 JobReport보기 스캐 폴딩과 직접 로젝트에 결합되어 있기 때문에 내가, 고객 엔티티를 바인딩 difficoult을 찾아 그 모델을 사용하는 경우 JobReport가 아니라. 또 다른 해결책은 CustomerID와 ProjectID를 모두 JobReport에 넣는 것입니다.하지만 중복 된 것처럼 보입니다. 내 마음 두 가지 가능성에 내가 가진

Design 2

: 1 별도로 2 그래서 나는 모든 ID가 두 번째 모델을 사용하여 첫 번째 모델을 유지하고 JobReport와 뷰 모델을 만들고 고객.

당신은 어떻게 생각하십니까? 이 사례를 어떻게 구현 하시겠습니까?

대단히 감사합니다 !!

최대

답변

0

관찰 몇 하나 JobReport는 다른 고객에 속하는 여러 프로젝트를 참조 할 수 있어야하지 않는

  • 디자인 (1)는, 적절한 것 같다.
  • ProjectID 속성은 고객 유형에 속하지 않습니다. 맞습니까? 프로젝트 컬렉션은 정당합니다.
  • 프로젝트 유형에는 특정 개체에 속한 모든 보고서를 나열하는 JobReports 컬렉션이 있어야합니다.

이 문제는 도메인 기반 디자인에서 집계를 식별하는 것과 관련된 문제입니다. 고객 엔티티는 자연 집계 루트 인 것으로 보입니다. 즉, 집계 내의 오브젝트와의 모든 상호 작용이 고객을 통과해야합니다.

이것은 DbContext이 대신 같이해야한다는 의미 :

public IEnumerable<JobReport> GetReportsByCustomer(int customerId) 
{ 
    using (var context = new EFDBContext()) 
    { 
     return context.Customers.Where(x => x.CustomerID.Equals(customerId)) 
      .SelectMany(x => x.Projects) 
      .SelectMany(x => x.JobReports) 
      .OrderBy(x => x.Timestamp); 
    } 
} 

당신에게 :

public class EFDBContext : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

그리고 고객에 속하는 하위 항목을 얻을, 당신은 관계를 통과 할 LINQ를 사용 집계 루트이기 때문에 고객을 편집 작업의 기준으로 항상 사용하도록 선택할 수도 있습니다.이것은 데이터베이스에서 고객을 끌어 포함 모든 세부 데이터가 포함되어 있는지 확인합니다 :

public IEnumerable<Customer> GetCustomer(int customerId) 
{ 
    using (var context = new EFDBContext()) 
    { 
     return context.Customers 
      .Include(x => x.Projects.Select(y => y.JobReports)) 
      .FirstOrDefault(x => x.CustomerID.Equals(customerId)); 
    } 
} 

수동으로 작동 할 수있는 위의 코드에 대한 귀하의 클래스 파일의 상단에 using System.Data.Entity;를 추가해야합니다.

+0

귀하의 의견을 올바르게 말씀드립니다. 내 의심은 JobReport를 사용하여 고객을 구부릴 것인지 또는 그렇지 않은지를 결정하는 것이 었습니다. 너는 나의 의심을 제거한다. 감사!! –

+0

그리고 Razor에서 고객의 유효성을 확인하려면 어떻게해야합니까? @ Html.ValidationMessageFor (model => model.CustomerID, "", new {@class = "text-danger"}) –

+0

그러면 작업 보고서뿐만 아니라 고객 엔티티에서 작업하고있는 것으로 보입니다. 고객 데이터와 세부 데이터에 모두 액세스 할 수있는 방법을 알고 싶으면 업데이트 된 답변을 참조하십시오. –

관련 문제