2017-06-13 3 views
0

私は2つのエンティティがあります。私は、Web APIコントローラ内のポートフォリオデータを取得する場合、私が行うことができますEntityFrameworkCore:ForeignKeyを使用して検索エンティティを逆引きする方法は?

public class Org : BaseEntity, IEntityBase 
    { 
     public string Name { get; set; } 
    } 

public class Portfolio : BaseEntity, IEntityBase 
    { 
     public string Name { get; set; } 
     public int OrganizationId { get; set; } 

     [ForeignKey("OrganizationId")] 
     public virtual Org Organization { get; set; } 
     public bool IsPrivate { get; set; } 
    } 

を:dbSet.Include(a=>a.Organization)を関連Orgデータをロードします。 Orgの中からこのルックアップを "逆"する方法がありますか?Orgに外来キーを持っているすべてのPortfolioをロードするには?

プロパティを追加すると、ループ参照無限ループが発生します。2つのエンティティが互いに相互参照するためです。

私は、データを取得する方法はこれです:それは組織にポートフォリオのリストを追加するのと同じくらい簡単なはず

public virtual IEnumerable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties) 
    { 
     IQueryable<T> query = _context.Set<T>(); 
     foreach (var includeProperty in includeProperties) 
     { 
      query = query.Include(includeProperty); 
     } 
     return query.AsEnumerable(); 
    } 

OrgRepo.AllIncluding(a=>a.Portfolios)

+0

あなたは組織クラスのプロパティ一覧を作成することができます。 –

答えて

1

public class Org : BaseEntity, IEntityBase 
{ 
    public string Name { get; set; } 
    public List <Portfolio> Portfolios { get; set; } //Note, the naming should be plural, to indicate one to many 
} 

https://docs.microsoft.com/en-us/ef/core/modeling/relationshipsにもこの情報があります。

+0

これを実行してPortfolioをインクルードすると、Orgがポートフォリオを参照してポートフォリオが組織を参照しているため、「自己参照ループがプロパティ '組織'に対して検出されました」というメッセージが表示されます。 – abolotnov

+0

https://docs.microsoft.com/ en-us/ef/core/querying/related-data#関連するデータとシリアライゼーションは、それに関するいくつかの助けを与えるはずです! – Max

0

例:

public class Org : BaseEntity, IEntityBase 
    { 
     public string Name { get; set; } 
     public ICollection<Portfolio> Portfolios { get; set; } 
    } 

    public class Portfolio : BaseEntity, IEntityBase 
    { 
     public string Name { get; set; } 
     public int OrganizationId { get; set; } 

     [ForeignKey("OrganizationId")] 
     public virtual Org Organization { get; set; } 
     public bool IsPrivate { get; set; } 
    } 

用途:

var orgs= _context.Portfolios.Include(a=>a.Organization).select(s=>s.Organization); 
var portfolios= _context.Orgs .Include(a=>a.Portfolios).SelectMany(s=>s.Portfolios); 
関連する問題