2016-12-29 10 views
0

私はEntity Frameworkコア - コンポジットキーとの関係を正しくマップする方法

施設

Id int (PK) 
Name 

ログイン

FacilityId int 
Hour int 
Value 

Visitが複合キー(FacilityId, Hour)

entiを持って、次のテーブル構造を持っていますTYクラスは私のDbContextクラスがOnModelCreatingメソッドで次のように持っている

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; } 
} 

のように定義されています

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

私のASP.NetコアWebAPIのからここ

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); 

は、得られたJSONある質問:なぜ訪問JSONはnullですか?どのような構成がありますか?

ありがとうございます。

+2

構成は、おそらく大丈夫です。あなたが欠けているものは[関連データの読み込み]です(https://docs.microsoft.com/en-us/ef/core/querying/related-data)。 –

+1

'Facility'を取得したときに' .Include'を使うべきです、EFはデフォルトでLazy Loadingを有効にしています。 –

+2

@IvanStoevとM. Wisnicki迅速な対応とドキュメントへの私の指摘の両方に感謝します。私はコントローラにMissing .Includeを追加するとVisitsを返すことを確認できます。 – rams

答えて

2

EFのデフォルトでは、Lazy Loadingが有効になっています。これは、"visits":nullという理由があります。しかし、それは正常です。クエリで.Include()関数を使用してEagerローディングを使用する必要があります。具体的な使用例については、docsを参照してください。

このサンプルコードGETALL FacilityVisits

var allData = context.Facility 
       .Include(d => d.Visits) 
       .ToList(); 
関連する問題