2011-10-13 2 views
2

내가 다음 POCO 클래스가 있다고 가정 해 다른 외래 키와 데이터 주석 충돌에 : 나는 SomeOtherModel를 가리키는 AuditableModel에 외부 키를이 예에서EF 코드 먼저 단방향 일대

public class AuditableModel 
{ 
    public int ID { get; set; } 

    public int? SomeOtherModelID { get; set; } 

    [ForeignKey("SomeOtherModelID")] 
    public SomeOtherModel SomeOtherModel { get; set; } 

    public int LastUpdateBy { get; set; } 

    [ForeignKey("LastUpdateBy")] 
    public AuditableModel LastUpdateByModel { get; set; } 
} 

public class SomeOtherModel 
{ 
    public int ID { get; set; } 

    public int LastUpdateBy { get; set; } 

    [ForeignKey("LastUpdateBy")] 
    public AuditableModel LastUpdateByModel { get; set; } 
} 

을 가지고 SomeOtherModel의 외래 키는 AuditableModel을 가리키며, 둘 다 일대 다이며 단방향이어야합니다.

AuditableModel 클래스를 쿼리 할 때 "연결의 주요 끝을 확인할 수 없습니다"예외가 발생합니다.

  1. AuditableModel
  2. 코드를 유창하게 API를 사용하여 DbContextOnModelCreating 방법 SomeOtherModel의 관계에 SomeOtherModelIDSomeOtherModel 속성을 제거 :이 예외를 해결하기 위해 찾은 방법은 두 가지가 있습니다.

유창한 API를 사용하여 구현 하겠지만 관례 및 데이터 주석을 통해 완벽하게 구현했습니다. 방법이 있습니까, 아니면 구성을 통해 이러한 관계를 정의해야합니까?

답변

1

나는 @에 동의합니다. 이것은 Fluent API에서만 작동합니다. 정확하게 여기에서 잘못되는 것은 컨벤션이 AuditableModel의 단일 탐색 속성을 감지하고 SomeOtherModel을 참조하고 SomeOtherModel의 단일 탐색 속성이 AuditableModel을 나타내는 것입니다. 매핑 규칙은 엔티티 간의 일대일 관계 (탐색 속성이 컬렉션이 아니기 때문에)를 만들려고합니다. 주체가 무엇인지, 종속 관계가 무엇인지 명확하지 않기 때문에이 예외를 얻을 수 있습니다.

이 문제를 해결할 수있는 데이터 주석 속성이 없습니다. 즉, 실제로 두 개의 관계가 각 관계에 대해 노출되지 않은 여러면으로 작성되어야한다고 EF에 알리는 것입니다. Fluent API에서만이를 구성 할 수 있습니다 (매개 변수없이 WithMany() 오버로드 사용).

1

도메인 모델에 따라 AuditableModel에서 SomeOtherModelID을 제거하는 옵션이 없을 수 있습니다.

속성 기반/협약 기반 구성에는 제한이 있습니다. 따라서이 경우 관례에 따라 유추되는 관계가 필요한 것이 아니기 때문에 Fluent API로 대체해야합니다.

관련 문제