2016-12-29 182 views
0

我有以下的表結構實體框架核心 - 如何正確映射與複合鍵的關係?

設施

Id int (PK) 
Name 

訪問

FacilityId int 
Hour int 
Value 

Visit具有複合關鍵字(FacilityId, Hour)

的ENTI TY類被定義爲

class Facility 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Visit> Visits { } 
} 

class Visit 
{ 
    public int FacilityId { get; set; } 
    public int Hour { get; set; } 
    public int Value { get; set; } 
    public Facility Facility { get; set; } 
} 

DbContext類在OnModelCreating方法如下:

modelBuilder.Entity<Facility>() 
       .ToTable("Facility") 
       .HasKey(f => f.Id); 
modelBuilder.Entity<Facility>() 
       .HasMany(f => f.Visits) 

modelBuilder.Entity<Visit>() 
       .ToTable("Visits") 
       .HasKey(v => new { v.FacilityId, v.Hour}); 
modelBuilder.Entity<Visit>() 
       .HasOne(a => a.Facility) 
       .WithMany(a => a.Visits) 
       .HasForeignKey(a => a.FacilityId) 
       .HasPrincipalKey(a => a.Id); 

這裏是我的ASP.Net核心的WebAPI

[{"id":1,"name":"Facility1","visits":null},  {"id":2,"name":"Facility2","visits":null}] 

問題產生的JSON:爲什麼訪問JSON爲空?我錯過了什麼配置?

在此先感謝。

+2

配置可能是罰款。你缺少的是[加載相關數據](https://docs.microsoft.com/en-us/ef/core/querying/related-data)。 –

+1

當你得到'Facility'時應該使用'.Include',EF默認打開Lazy Loading。 –

+2

@IvanStoev和M. Wisnicki感謝您的快速反應,並指出我的文檔。我可以確認,在我的控制器中添加缺少的.Include現在返回訪問。 – rams

回答

2

EF默認打開Lazy Loading這就是您獲得"visits":null的原因。但這很正常。通過在查詢中使用.Include()函數需要使用Eager加載。具體示例請參見docs使用急切加載。

此示例代碼GETALL FacilityVisits

var allData = context.Facility 
       .Include(d => d.Visits) 
       .ToList();