2012-08-03 3 views
0

저는 EF 코드 우선을 처음 접했고 간단히 질문 할 수 있습니다. EF 코드와의 단방향 관계 매핑 우선

나는 사람과 주소 간의 간단한 관계가 : 내 사람들이 테이블에 AddressID 했어

People 
------ 
PersonID 
Name 

Address 
------- 
AddressID 
Address1 
PersonID 

대부분의 시간을; 하지만이 DB는 PersonID를 참조한다는 점에서 약간 "뒤로"있습니다. 필자는 Person 객체를 다루고 관련 주소를 얻고 싶다. 이 관계는 1 인당 많은 주소를 가질 수 있지만 항상 1 : 1입니다. (제 3 자 DB입니다. 스키마를 제어 할 수 없습니다.)

Person과 Address를 연결하기 위해 Code First의 관계를 어떻게 설정합니까? 유창한 API를 사용하고 있지만 두 엔티티에 키가 없어도이를 설정하는 방법은 없습니다. 이상적으로, 나는 나의 실체가 같이 설정할 수 싶습니다 :

Person { 
public int PersonID {get;set;} 
public string Name {get;set;} 
//other person properites 

//navigation property 
public Address Address {get;set;} 
} 

Address { 
public string Address1 {get;set;} 
//other properties for address 

//navigation property 
public Person Person {get;set;} 
} 

나는 관계를 구성 할 수있는 몇 가지 방법을 시도했다, 그러나 그것은 밖으로 erroring 유지합니다. Address 클래스를 복잡한 유형으로 정의하려고 시도했지만 별도의 테이블이므로 작동 할 수 있습니까? 또한 HasOptional 및 WithOptionalDependant를 사용하여 시도했지만 아무 소용이 없습니다.

그래서 내 EF CF 로직을 구성하여 Person 내의 엔티티 인 주소를 허용하는 방법에 대한 의견.

어떤 제안이나 도움을 주시면 대단히 감사하겠습니다.

업데이트 아래에서 Mark의 제안을 시도했지만 다른 오류가 발생합니다.

modelBuilder.Entity<Address>() 
.HasKey(a => a.PersonID); 

modelBuilder.Entity<Address>() 
.Property(a => a.PersonID) 
.HasColumnName(<my real column name>); 

는 그래서 DB에서 엔티티의 키가 PersonID이지만, 그것은 FK 다시 사람도있다 :

내 주소 엔티티 설정 세트 엔티티 키로 PersonID (내 의견을 참조하십시오). 이것이 문제의 원인입니까? (다시, 제 DB가 아닙니다 - 제 3 자입니다.) 도움을 주시면 대단히 감사하겠습니다. 감사!!

답변

0

에 나는 마크의 제안을 가고 그것을 알아 냈다.사람은 주소가 없을 수 있기 때문에, 필요한 매핑 (가능성이없는,하지만 난 그게 가능하다고 생각)하지만 주소의 PK가이다 년부터 주소는 사람이 있습니다

modelBuilder.Entity<Person>() 
    .HasOptional<Address>(p => p.Address) 
    .WithRequired(a => a.Person); 

나는 옵션을 설정해야합니다 PersonID.

결과를 직렬화 할 때 Person과 Address 사이의 순환 참조입니다 (결과를 JSON에 직렬화 할 때 컨트롤러에서이를 잡았습니다). 나는 사람 주소 정보를 얻고 내 특정 쿼리 (들)에 대한 컨텍스트에 프록시 생성을 비활성화하여이 문제를 가지고 :

_context.Configuration.ProxyCreationEnabled = false; 

나는 떨어져 내 주소 정보를 얻을 게으른로드를 사용하는 것이 한 후 나는 그것을 필요로 할 때 모든 일을한다. 모두에게 도움을 주셔서 감사합니다!

1

1 : 1 관계를 원하십니까?

관계가 많은 사람이 1 명일 수 있지만 주소는 항상 입니다. (제 3 자 DB입니다. 스키마를 제어 할 수 없습니다.)

실제로 1 : 많은 관계가 올바른 것입니까? 말했다되고 그건

, 나는 탐색 모음이 사람 개체에 주소 (들)에 매핑 할 수있는 이상적인 방법이 될 것이라고 생각 : 여기

Person { 
public int PersonID {get;set;} 
public string Name {get;set;} 
//other person properites 

//navigation property 
public virtual ICollection<Address> Addresses {get;set;} 
} 

그리고있어 해당 (유창함이 당신이 PersonID 매핑 있다고 가정 당신이 당신의 코드에서 DB 설명하지만,하지 않을 때 당신이 할 주소)

modelBuilder.Entity<Person>() 
      .HasMany(p => p.Addresses) 
      .WithRequired(a => a.Person) 
      .HasForeignKey(a => a.PersonID); 
+0

답변 해 주셔서 감사합니다. 나는 1 : 많은 설정을 시도하지 않았다. 변경 사항을 적용했을 때 'Person_Addresses'관계에서 'Multiplicity가'Person_Addresses_Target '역할에서 유효하지 않습니다. Dependent Role은 키 속성을 참조하기 때문에 Dependent Role의 다중 도의 상한선은 '1'이어야합니다. "내 설정에서 Address 테이블의 PK는 PersonID이고이 키가 내 엔터티 키로 설정되어 있습니다. 모델 빌더 설정. –

+0

아하나. 나는 당신의 셋업을 오해했다. 나는 AddressId가 테이블의 PK라고 생각했다. 어쩌면 [콘크리트 별 표] (http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/25/table-per-concrete-type-inheritance-inentity-framework.aspx) 더 많은 도움이 될까요? –