2016-08-22 2 views
1

아래처럼 보이는 클래스를 매핑하려고하지만 인터페이스 인 Facility.Projects 속성과 관련하여 예외가 발생합니다.명시 적으로 Entity Framework 7의 인터페이스 멤버 매핑

Facility.Projects 속성은 IProject 인터페이스 유형입니다. 탐색 속성 인 경우 매핑 된 엔터티 형식으로 캐스팅하여이 속성의 관계를 수동으로 구성하거나 그렇지 않으면 모델에서 속성을 무시합니다.

public class Facility : BaseData 
{ 
    [ForeignKey("ClientId")] 
    public Client Owner { get; set; } 

    public List<IProject> Projects { get; protected set; } 

    public Facility() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     Projects = new List<IProject>(); 
    } 
} 

나는 Facility가 맵핑되는 DbContext 클래스의 OnModelCreating 방법을 통해 다른 속성을 매핑 적이 있지만 정말 HasColumnType보다이 다른 캐스팅 정확한 지점처럼 보인다 아무것도 보이지 않아요도있는 잘못된 것 같습니다.

public class FacilityRepository : BaseRepository<Facility>, IFacilityRepository 
{ 
    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder 
      .Entity<Client>() 
      .Property(f => f.Id) 
      .ForSqliteHasColumnName("ClientId"); 

     modelBuilder 
      .Entity<Project>() 
      .Property(x => x.Id) 
      .ForSqliteHasColumnName("ProjectId"); 


     // area where I've tried and failed to find a good spot to do some manual casting 
     modelBuilder 
      .Entity<Facility>() 
      .Property(f => f.Projects) 
      .HasColumnType<Project>(new PropertyBuilder()); 
    } 
} 

누구나 올바른 방향으로 나를 가리킬 수 있습니까? 설명서에 도움이 될만한 것을 본 적이 없습니까? 또는 규칙에 따라, 나는 이것을 전혀하지 않아야합니까?

+0

필요한 정확한 유형을 알고있는 이유는 여기에서 인터페이스를 사용하는 이유는 무엇입니까? 'Projects' 속성을'List ' – DavidG

+0

으로 변경하십시오. 솔직히, @DavidG가 완료 될 수 있는지를 알기 만하면됩니다. 나는 아직도 이것에 붙어있는 컨텍스트의 나머지 부분을 만들고 있는데, 나는 정확한 타입을 모르는 경우를 보게 될 것이라고 확신한다. 할 수 없다면, 될 ​​수 없다. done (이 경우에도 방법을 찾을 수있을 것입니다) - 큰 것을 놓친다는 것을 알지 못했습니다. – prestonsmith

+0

아주 좋은 이유가 있습니다. 저장소로 인터페이스를 설계 한 경우 귀하의 비즈니스 로직, 예를 들어, 실제로 정상적으로하고 좋은 일을해야합니다. 당신이 이미 그것을 발견하지 않는 한 여기에 답변을 찾고 갈거야.) – Arwin

답변

1

일대 다 관계의 수동 매핑을 수행하려면 (이 예제는 부모에서 자식을 노출하는 것만 큼), 다음과 같이 설정할 수 있습니다. 그러면 캐스트

 modelBuilder.Entity<ProjectState>() 
      .HasMany(h => (ICollection<ProjectRoleState>)h.ProjectRoleStates) 
      .WithOne() 
      .HasForeignKey(p=>p.ProjectGuid);