Can anybody tell me why the related Article
entities are not being loaded on .Include(a => a.Article)
? They are always NULL
even though ArticleId
does indeed have a value. The relationship between FrontPageItem
and Article
is 1-0..1. An Article
can exist without any connection to a FrontPageItem
, but a FrontPageItem
must have one Article
.
In a rather ugly workaround, I have resorted to foreach
-ing through all the returned items in the list and adding Article
manually, as you can see in my index-method below.
public async Task<IActionResult> Index()
{
List<FrontPageItem> items = await db.FrontPageItems
.Include(a => a.Article)
.ThenInclude(c => c.CreatedBy)
.ThenInclude(m => m.Member)
.Include(a => a.Article)
.ThenInclude(e => e.EditedBy)
.ThenInclude(m => m.Member)
.Include(a => a.Article)
.ThenInclude(e => e.PublishReadyBy)
.ThenInclude(m => m.Member)
.Include(p => p.WebPage)
.OrderByDescending(o => o.DatePublished)
.ToListAsync();
// I don't want to foreach, but without it, Article is always NULL for all items.
foreach (FrontPageItem item in items)
{
item.Article = await db.Articles
.Where(a => a.Id == item.ArticleId).FirstOrDefaultAsync();
}
List<FrontPageItemViewModel> vm =
auto.Map<List<FrontPageItemViewModel>>(items);
return View(vm);
}
These are the models:
public class FrontPageItem
{
public int Id { get; set; }
// ... some more properties
public int? ArticleId { get; set; }
public Article Article { get; set; }
public AdminUser CreatedBy { get; set; }
public AdminUser EditedBy { get; set; }
public AdminUser PublishedBy { get; set; }
}
public class Article
{
public int Id { get; set; }
// ... some more properties
public int? FrontPageItemId { get; set; }
public FrontPageItem FrontPageItem { get; set; }
public AdminUser CreatedBy { get; set; }
public AdminUser EditedBy { get; set; }
public AdminUser PublishReadyBy { get; set; }
}
public class AdminUser
{
public int Id { get; set; }
// ... some more properties
public int MemberId { get; set; }
public Member Member { get; set; }
}
public class Member
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
// ... some more properties
public AdminUser AdminUser { get; set; }
}
This is the model-builder:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Article>()
.HasOne(p => p.FrontPageItem)
.WithOne(i => i.Article)
.HasForeignKey<Article>(b => b.FrontPageItemId);
}