【发布时间】:2019-05-01 20:18:47
【问题描述】:
谁能告诉我为什么相关的Article 实体没有被加载到.Include(a => a.Article) 上?它们总是NULL,即使ArticleId 确实有价值。 FrontPageItem 和 Article 之间的关系是 1-0..1。 Article 可以在没有任何连接到 FrontPageItem 的情况下存在,但 FrontPageItem 必须有一个 Article。
在一个相当丑陋的解决方法中,我使用foreach-ing 遍历列表中的所有返回项目并手动添加Article,正如您在下面的索引方法中看到的那样。
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);
}
这些是模型:
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; }
}
这是模型构建器:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Article>()
.HasOne(p => p.FrontPageItem)
.WithOne(i => i.Article)
.HasForeignKey<Article>(b => b.FrontPageItemId);
}
【问题讨论】:
-
如果你尝试这个 `var items = await db.FrontPageItems.Include(a => a.Article).ToListAsync();` 你有空值吗?
-
@hassan.ef 是的。还是
null. -
您的实体模型出了点问题,尤其是当您对previous question 使用公认的错误 答案时。关系仅包括 1 个 FK,因此
FrontPageItem中的ArticleId或Article中的FrontPageItemId都是多余的。很可能是第二个。所以保留第一个,删除第二个并使用.HasForeignKey<FrontPageItem>(b => b.ArticleId)。与链接问题的其他关系类似。 -
@IvanStoev 是的!你可以把它写下来作为答案,我会接受的。
标签: c# linq asp.net-core entity-framework-core