实体框架核心(EF 7)多对多结果始终为空

时间:2016-06-24 18:20:38

标签: entity-framework-core

我已按照Issue #1368Docs Here中描述的多对多解决方法的说明进行操作...但是当我尝试导航时,它始终返回null。

我的模特:

    public class Organization
{
    public Guid OrganizationID { get; set; }

    //...

    public ICollection<OrganizationSubscriptionPlan> OrganizationSubscriptionPlans { get; set; }

}

public class SubscriptionPlan
{
    public int SubscriptionPlanID { get; set; }

    //...

    public ICollection<OrganizationSubscriptionPlan> OrganizationSubscriptionPlans { get; set; }


public class OrganizationSubscriptionPlan
{
    [ForeignKey("Organization")]
    public Guid OrganizationID { get; set; }
    public Organization Organization { get; set; }

    [ForeignKey("SubscriptionPlan")]
    public int SubscriptionPlanID { get; set; }
    public SubscriptionPlan SubscriptionPlan { get; set; }
}

ApplicationDbContext:

    protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<OrganizationSubscriptionPlan>().HasKey(x => new { x.OrganizationID, x.SubscriptionPlanID });
    builder.Entity<OrganizationSubscriptionPlan>().HasOne(x => x.Organization).WithMany(x => x.OrganizationSubscriptionPlans).HasForeignKey(x => x.OrganizationID);
    builder.Entity<OrganizationSubscriptionPlan>().HasOne(x => x.SubscriptionPlan).WithMany(x => x.OrganizationSubscriptionPlans).HasForeignKey(x => x.SubscriptionPlanID);
}

我的查询:

var organizations = _context.Organizations
    .Include(o => o.OrganizationSubscriptionPlans);

foreach (var organization in organizations)
{
    //....
    var subscriptions = organization.OrganizationSubscriptionPlans
            .Select(s => s.SubscriptionPlan);
     // ^^^^^^^^^^^ why is subscriptions always null?
}

&#34;组织&#34; query按预期返回结果,包括每个中的OrganizationSubscriptionPlans列表,但是当我尝试在foreach循环中导航到它们时,&#34; subscriptions&#34;查询每次都返回null。我做错了什么?

2 个答案:

答案 0 :(得分:5)

原来这是一个延迟加载问题。您必须“包含”加入实体,然后“ThenInclude”另一个实体。

var organizations = _context.Organizations
    .Include(o => o.OrganizationSubscriptionPlans)
    .ThenInclude(s => s.SubscriptionPlan);

答案 1 :(得分:0)

ForeignKey attr用于修饰引用属性以指示它们保存FK值的原始属性。

public class OrganizationSubscriptionPlan
{    
    public Guid OrganizationID { get; set; }
    [ForeignKey("OrganizationID")]
    public Organization Organization { get; set; }

    public int SubscriptionPlanID { get; set; }
    [ForeignKey("SubscriptionPlanID")]
    public SubscriptionPlan SubscriptionPlan { get; set; }
}