2016-12-29 45 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();