0

데이터 일치를 사용하여 many to may 관계를 매핑하고자하는데, 이것이 나의 경우입니다. 데이터 주석을 통한 CF m-to-n 관계

는 접합 테이블이 소스에서 다른 FK 이름을 포함 보는 바와 같이 나는 다음 표

Foo: 
FooId int identity 
FooName varchar(max) not null 

Bar: 
BarId int identity 
BarName varchar(max) not null 

FooBarRelationships 
TheBarId int 
TheFooId int 

을 말해봐. 또한 테이블의 이름은 다른

나는 순서대로 테이블 FooBarRelationships이 접합 테이블 및 TheBarId가되었는지 확인하는 데이터 주석을 사용하여 내 수업을 수정하는 방법

[Table("Foo")] 
public class Foo { 
    [Key] 
    public Int32 FooId { get; set; } 
    public String FooName { get; set; } 

    public IEnumerable<Bar> Bars { get; set; } 
} 

[Table("Bar")] 
public class Bar { 
    [Key] 
    public Int32 BarId { get; set; } 
    public String BarName { get; set; } 

    public IEnumerable<Foo> Foos { get; set; } 
} 

다음과 같이 내 클래스는 Bar 테이블과 TheFooId에서 외래 키는 Foo 테이블에서 외래 키입니까?

P.

IEnumerable<T>으로 선언 된 탐색 속성은 ICollection<T>이 아니어야합니다.

나는

public class BarMap : EntityTypeConfiguration<Bar> { 
    public BarMap() { 
     this.HasMany(t => t.Foos) 
      .WithMany(t => t.Bars) 
      .Map(m => { 
       m.ToTable("FooBarRelationships"); 
       m.MapLeftKey("TheBarId"); 
       m.MapRightKey("TheFooId"); 
      }); 
    } 
} 

이 다음과 같이 보이는 나에게 다음과 같은 오류를 제공지도 클래스를 사용하여 매핑 시도했습니다. 방법

유형 인수 'System.Data.Entity.ModelConfiguration.EntityTypeConfiguration < 바 > .HasMany <TTargetEntity> (System.Linq.Expressions.Expression < System.Func < 바, ICollection에 <TTargetEntity> > >) '는 사용법에서 유추 할 수 없습니다. 형식 인수를 명시 적으로 지정하십시오.

IEnumeralbe<T>ICollection<T>으로 변경하지 않고이 오류를 해결할 수있는 방법이 있으면 환영합니다.

답변

1

엔티티 프레임 워크에 할당 할 수있는 객체가 필요하기 때문에 나는 IEnumerable을 사용하지 않을 것이라고 생각합니다.

Are IEnumerable collection supported in EF 4.1 for mapping?

당신은 다른 각도에서 문제를 공격해야한다.

마지막 부분 :

당신이 많은 관계로 많은 선언 컬렉션의 양쪽 측면에있는 InverseAttribute를 사용할 수 있습니다. 열 Foo_FooIdBar_BarIdFooBars : 당신이 유창 매핑을 사용하지 않는 경우

[Table("Foo")] 
public class Foo { 
    [Key] 
    public Int32 FooId { get; set; } 
    public String FooName { get; set; } 
    [InverseAttribute("Foos")] 
    public ICollection<Bar> Bars { get; set; } 
} 

[Table("Bar")] 
public class Bar { 
    [Key] 
    public Int32 BarId { get; set; } 
    public String BarName { get; set; } 
    [InverseAttribute("Bars")] 
    public ICollection<Foo> Foos { get; set; } 
} 
+0

답장을 보내 주셔서 감사합니다. 나는 ICollection을 복원하고 그것이 의도를 깨뜨리지 않는 방식으로 솔루션을 재구성했습니다. 유창한 API를 사용하지 않고 표 메타 데이터를 제공하는 것과 데이터 주석을 사용하는 것에 관해서 질문의 첫 번째 부분에 대답 할 수 있습니까? – Oybek

1

당신이 뭔가를해야 기본 규칙에 의해 예상되는 접합 테이블의 이름과 열을 사용해야합니다.또한

@Inu IEnumerable 의해 답변에서 언급 한

은 지원되지 않습니다 - 적어도 lazy loading proxies demand ICollection 나는 (링크 대답에 언급 한 바와 같이)은 글로벌 요구 사항 것을 거의 확신합니다. 코드는 일반적으로 매핑에서 모든 IEnumerable 속성을 건너 뜁니다. 그것도 어떻게 든 지원됩니다 IEnumerable 그냥 인터페이스이며 뒤에 Collection, HashSet 또는 List 같은 클래스가있을 것입니다 그래서 열거 형을 노출 귀하의 엔티티를 사용하여 탐색 속성을 해당 컬렉션 클래스로 변환하는 코드를 제한하지 않습니다.