【问题标题】:EntityFrameworkCore: how to reverse lookup entities with ForeignKey?EntityFrameworkCore:如何使用 ForeignKey 反向查找实体?
【发布时间】:2017-06-13 12:59:31
【问题描述】:

当我有两个实体时:

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

当我在 web 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=&gt;a.Portfolios)

【问题讨论】:

  • 您可以在 Org 类中创建一个属性 List

标签: c# asp.net-mvc asp.net-core entity-framework-core


【解决方案1】:

应该像向 Org 添加一个 Portfolio 列表一样简单。

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 也有这方面的更多信息。

【讨论】:

  • 当我这样做然后 .Include 投资组合时,我遇到了“检测到属性'组织'的自引用循环”,因为组织查找投资组合并且投资组合查找组织:)
  • docs.microsoft.com/en-us/ef/core/querying/… 应该会给你一些帮助!
【解决方案2】:

例子:

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

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2020-07-15
    • 2023-03-16
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2013-04-10
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多