2016-08-22 37 views
1

我試圖映射一個類,看起來像下面,但我得到一個關於Facility.Projects屬性是一個接口異常。顯式映射實體框架中的接口成員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>(); 
    } 
} 

我已經制定通過了的DbContext類OnModelCreating方法Facility被映射到其他屬性,但我沒有真正看到任何東西,似乎是正確的位置比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。我仍然在構建與此相關的Contexts的其餘部分,我很確定我會遇到不知道確切類型的情況,如果無法完成,它不能完成(我確信我會在這些情況下找到解決方法) - 只是不知道我是否錯過了一些大的東西 – prestonsmith

+0

有一個非常好的理由如果您已經將存儲庫設計爲一個接口例如,你的業務邏輯實際上應該是一個正常的和好的事情,我現在繼續尋找答案,除非你已經發現它,但忘記在這裏分享它;; – Arwin

回答

1

要做一對多關係的手動映射(這個例子只是暴露父對象上的子對象,反之亦然),你可以如下設置它,然後它非常簡單應該是:

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