2015-02-05 6 views
3

에 1을 참조 나는 다음과 같은 개체가 :자가 많은 관계

public class TravelCoverageType 
{ 
    public int Code { get; set; } 

    public virtual TravelCoverageType PreventedBy { get; set; } 

    public ICollection<TravelCoverageType> PreventCoverages { get; set;} 
    ... 
} 

TravelCoverageType는 0 개 이상의 TravelCoverageType의 방지 할 수 있습니다.

유창한 API를 사용하고 있지만이 관계를 설명하는 방법을 알 수 없습니다.

public TravelCoverageTypeConfiguration() 
     { 
      ToTable(ConfigConstants.TypeTablePrifix + typeof(TravelCoverageType).Name + "s"); 
      HasKey(ct => ct.Code); 

      HasMany(tc => tc.PreventCoverages) 
       .WithOptional(tc=>tc.PreventedBy) 
       .HasForeignKey(tc => tc.Code); 
     } 

그러나 나는 다음과 같은 오류 얻을 :

나는 시도했다

System.Data.Entity.Edm.EdmAssociationType: : Multiplicity conflicts with the referential constraint in Role 'TravelCoverageType_PreventCoverages_Source' in relationship 'TravelCoverageType_PreventCoverages'. Because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be '1'.

System.Data.Entity.Edm.EdmAssociationEnd: : Multiplicity is not valid in Role 'TravelCoverageType_PreventCoverages_Target' in relationship 'TravelCoverageType_PreventCoverages'. Because the Dependent Role refers to the key properties, the upper bound of the multiplicity of the Dependent Role must be '1'.

(나는 관계 간단하게 정의 할 PreventedBy을 추가 한, 내가 정말 필요하지 않습니다를)

어떻게 완료 되나요?

답변

1

Fluent API를 사용해야합니까? 대신 [데이터 주석에 다음과 같은 난 너무 잘 알고 발생하지 않습니다,하지만 당신은 할 수 :

public class TravelCoverageType 
{ 
    [Key] 
    public int Code { get; set; } 

    [ForeignKey("PreventedBy")] 
    public int? PreventedByID { get; set; } 

    public virtual TravelCoverageType PreventedBy { get; set; } 

    public ICollection<TravelCoverageType> PreventCoverages { get; set;} 
} 

편집 : 귀하의 질문에 좀 더 가까이 보면, 나는 당신이하려고하는 것으로 나타났습니다 Code 속성은 FK로 사용할 수 :

.HasForeignKey(tc => tc.Code); 

EF 당신이보고있는 예외 (당신을 말하고 위해, 모든 것을 좋아하지 않는된다 당신은뿐만 아니라 그 기본 키 FK를 만들고 싶어 당신은 단지 1 : 1이 아니라 1 : 많은 것을 위해 그렇게 할 수 있습니다). (I 위의 데이터 주석 예처럼) 클래스에 새 특성을 추가하려고하고이에 구성을 변경 :

HasMany(tc => tc.PreventCoverages) 
.WithOptional(tc => tc.PreventedBy) 
.HasForeignKey(tc => tc.PreventedByID); 
+0

:( –

+0

답을 편집 – IronMan84

+0

나는 importan 생각합니다. 여기서 part는 nullable 외래 키입니다. 유창한 코드를 사용하면 잘 작동합니다.저는 Sections라고 불리는 타입을 가지고 있습니다. (경로 => course.ParentId) .WillCascadeOnDelete (false) : HasOptional (section => section.Parent) – jwize

0

문제 당신은 너무 FK 같은 엔티티의 PK를 사용하고있다 하지만 일대 다 관계를 구성 할 때는 그렇게 할 수 없습니다. 자체 참조 일대 다 관계를 만들고 해당 관계의 한 측면과 관련된 탐색 속성 만 갖기를 원한다면 (이 시나리오가 원하는 시나리오라고 생각합니다), 여러분의 모델은 다음과 같습니다 :

public class TravelCoverageType 
{ 
    public int Code { get; set; } 

    public ICollection<TravelCoverageType> PreventCoverages { get; set;} 
    ... 
} 

그리고 관계의 구성 은 다음과 같이 될 것이다 :

HasMany(tc => tc.PreventCoverages).WithOptional(); 

지금, 당신은 관계의 양쪽 작업 할 경우, 당신은 당신이로 PreventedBy 탐색 속성을 추가 할 필요가 당신이 보여주는 모델에서. 당신이 너무 FK 속성을 사용하여 작업 할 경우 그 경우에 당신이 당신의 PK의 동일한 유형의 다른 속성을 추가 할 필요가, 마지막으로

HasMany(tc => tc.PreventCoverages).WithOptional(tc => tc.PreventedBy); 

:이 경우, 당신은 관계를 이런 식으로 구성 할 수 있습니다 당신의 엔티티 :

public class TravelCoverageType 
{ 
public int Code { get; set; } 

public int PreventedById { get; set; } 
public virtual TravelCoverageType PreventedBy { get; set; } 

public ICollection<TravelCoverageType> PreventCoverages { get; set;} 
... 
} 

과의 관계의 구성은 다음과 같이 될 것이다 : 여기에 표준의

HasMany(tc => tc.PreventCoverages).WithOptional(tc => tc.PreventedBy).HasForeignKey(tc=>PreventedById);