简体   繁体   中英

EF 6: Include not building navigation properties

I cant seem to figure out why my navigation property is not getting built by my include statement.

Here is my method:

public async Task<IHttpActionResult> GetCompanies(string id)
    {
        DbContext.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
        var company = await DbContext.Companies.Where(x => x.Id.ToString() == id).Include(x => x.StartelAccounts).FirstOrDefaultAsync();

        if (company != null) 
        {
            return Ok(this.TheModelFactory.Create(company));
        }

        return NotFound();
    }

When I test the SQL from the debug log I get all the fields and values for both objects.

Here are the models:

public class CompanyGroup 
{
    [Key]
    public Guid Id { get; set; }

    [Required]
    [MaxLength(100)]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.Date)]
    public DateTime FirstBillingDate { get; set; }

    [Required]
    public int TermLength { get; set; }

    public virtual ICollection<ApplicationUser> Members { get; set; }
    public virtual ICollection<AccountStartel> StartelAccounts { get; set; }

    public CompanyGroup() 
    {
        Members = new HashSet<ApplicationUser>();
        StartelAccounts = new HashSet<AccountStartel>();
    }

}
public class AccountStartel
{

    [Key]
    public Guid Id { get; set; }

    [Required]
    public string ClientID { get; set; }

    [Required]
    public int DbId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string TimeZone { get; set; }

    [Required]
    public string AccountNum { get; set; }

    public Guid CompanyId { get; set; }

    public virtual CompanyGroup Company { get; set; }

    public virtual ICollection<UsageReport> UsageReports { get; set; }

    public AccountStartel() 
    {
        Company = new CompanyGroup();
        CompanyId = Guid.Empty;
        UsageReports = new List<UsageReport>();
    }
}

EF Fluent API

modelBuilder.Entity<AccountStartel>()
            .HasRequired<CompanyGroup>(x => x.Company)
            .WithMany(x => x.StartelAccounts)
            .HasForeignKey(x => x.CompanyId);

        modelBuilder.Entity<AccountStartel>()
            .Property(p => p.DbId)
            .IsRequired()
            .HasColumnAnnotation(
                IndexAnnotation.AnnotationName,
                new IndexAnnotation(
                    new System.ComponentModel.DataAnnotations.Schema.IndexAttribute("IX_StartelDbId", 1) { IsUnique = true }));

Can anyone see what im missing here?

Could it have to do with setting Company and/or CompanyId in the AccountStartel constructor? Does it work if you remove those lines? – Peter

Initializing the navigation properties to a default value caused EF to not load them correctly.

Here is the updated model which does work now

public class AccountStartel
{

    [Key]
    public Guid Id { get; set; }

    [Required]
    public string ClientID { get; set; }

    [Required]
    public int DbId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string TimeZone { get; set; }

    [Required]
    public string AccountNum { get; set; }

    public Guid CompanyId { get; set; }

    public CompanyGroup Company { get; set; }

    public virtual ICollection<UsageReport> UsageReports { get; set; }

    public AccountStartel() 
    {
        UsageReports = new List<UsageReport>();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM