1

Customers 테이블과 Addresses 테이블이 있습니다. 고객은 많은 주소를 가질 수 있지만 주소가있는 경우 기본 주소로 표시된 주소도 있습니다.Entity Framework 코드 첫 번째 사용자 지정 조인

"PrimaryAddress"라는 고객 POCO에 필드를 넣을 수있는 일종의 코드가 있으며 Customers.Include (customer => customer.PrimaryAddress)와 같은 것을 사용하여 고객과 관련이 있으며 기본 비트가 설정되어 있습니까?

사용자 정의 조인을 수행하는 SQL에서보기를 작성하는 것이 가장 좋습니다.

감사합니다.

답변

3

직접적인 생각은 아닙니다. 당신이 무언가를지도로 만들면 관계 또는 칼럼으로 끝날 것입니다.

CREATE TABLE dbo.Customers 
(
    ... 
    PrimaryAddress_ID INT NULL 
) 

당신이 중 하나를 Addresses 1로 매핑 할 것이다 Address 개체 정의에 따라 : 그것은 테이블로 끝날 것

public class Customer 
{ 
    ... 
    public Address PrimaryAddress { get; set; } 
    public ICollection<Address> Addresses { get; set; } 
} 

: N에 (Customer_ID를 같은 당신이 기대하는 경우 고객은 볼 수 있습니다 Addresse 테이블 또는 M : N (접합 테이블) 관계

PrimaryAddress_ID은 cus와 관련된 주소 여야한다는 제약이 있어야하기 때문에 그리 좋지 않습니다. tomer. 이러한 제한은 아마도 방아쇠로 점검해야합니다.

또한 읽기 전용 응용 프로그램을 작성하거나 INSTEAD OF 트리거를 정의 할 준비가되어 있지 않으면보기가 필요하지 않습니다.

public class Customer 
{ 
    ... 
    public ICollection<Address> Addresses { get; set; } 

    [NotMapped] 
    public Address PrimaryAddress 
    { 
     get 
     { 
      return Addresses.Single(a => a.IsPrimary); 
     } 
     // If you need set you can implement it in similar way 
    } 
} 

당신은 또한 속성없이 정의 할 수 있지만 IgnoreOnModelCreating에 사용할 필요가 :

당신은 매핑하지 않고 그것을 할 수

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Customer>() 
     .Ignore(c => c.PrimaryAddress); 
} 

접근 방법의 단점이 있다는 것입니다 항상 모든 주소를로드합니다. 경우

당신은 당신이 사용할 수있는 다른 다음 기본 주소를 필요로하지 않습니다 알고

context.Entry<Customer(customer) 
    .Collection(c => c.Addresses) 
    .Query() 
    .Where(a => a.IsPrimary) 
    .Load(); 

이 내용은 기본 주소를로드하지만 당신은 데이터베이스에 roundrips해야합니다 있도록 먼저 고객을로드해야합니다.

+0

감사합니다. 흥미로운 점이 몇 가지 있습니다. 나는 테이블이 이미 데이터베이스에 있다고 언급 했으므로 코드 생성 측면에 대해서는 걱정하지 않지만 게시물에서 여러 가지 새로운 것을 배웠습니다! 나는 검색 결과만을위한 것이기 때문에 여전히 뷰를 사용할 수 있으며 다중 왕복 여행에 대한 아이디어가 마음에 들지 않습니다. – stewartml

관련 문제