2017-06-13 95 views
0

當我有兩個實體: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; } 
    } 

當我取回網頁API控制器內部投資組合數據,我可以這樣做:dbSet.Include(a=>a.Organization)加載相關Org數據。有沒有一種方法可以從Org中「反轉」這種查找(加載所有Portfolio的外鍵到被查看的Org)?

當我添加一個List<Portfolio> Portfolios {get;set;}屬性時,我遇到了循環引用無盡循環:我假設因爲兩個實體相互引用。

我檢索數據的方式是這樣的:

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

它應該是爲增加投資組合的清單,ORG一樣簡單。

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

當我這樣做,然後包括投資組合時,我遇到了「自查組織查找的自我參考循環」,因爲組織查找了投資組合和投資組合查找組織:) – abolotnov

+0

https://docs.microsoft.com/ en-us/ef/core/querying/related-data#related-data-and-serialization應該會給你一些幫助! – 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);