我对EF有一个相当奇怪的问题。我正在显示一个场景列表,其中包含与每个场景相关联的MfgSite。以下是模型:
//Models
public partial class Scenario
{
public string Name { get; set; }
public bool IsFinal { get; set; }
public Guid Uid { get; set; }
public string Username { get; set; }
public string Description { get; set; }
public Guid MfgSiteUid { get; set; }
//navigation property
public MfgSite MfgSiteU { get; set; }
}
public partial class MfgSite
{
public string MfgSiteCommonName { get; set; }
public string MfgSiteState { get; set; }
public string MfgSiteFunction { get; set; }
public string MfgSiteDesc { get; set; }
public Guid Uid { get; set; }
//navigation property
public Scenario Scenario { get; set; }
}
在我的场景控制器索引操作中,我有以下代码(请注意,我首先使用Scaffold-DbContext)从db生成模型。返回的列表将MfgSiteU设置为null,除了方案中每个唯一的MfgSiteUid的一个条目外。
//Scenario Controller Index Action
public async Task<IActionResult> Index()
{
var sContext = _context.Scenario.Include(s => s.MfgSiteU);
return View(await sContext.ToListAsync());
}
空列是因为s.MfgSiteU为空,即使s.MfgSiteUid准确且不为空。 MfgSiteCommonName应该是第二行的“Test Site 1”和第三行和第四行的“Test Site 2”。
什么可能导致此问题以及可能的修复方法是什么?作为调试的一部分,我尝试使用DbSet上的foreach一次导航一个场景,并手动将每个场景添加到List。我可以看到MfgSiteU在各个上面都不是空的,但是有些如何在我迭代结束时将之前的那些重置为null。
答案 0 :(得分:2)
什么可能导致此问题以及可能的修复方法是什么?
问题在于,根据示例数据,Scenario
和MfgSite
之间的关系是多对一,而生成的关系是一-to酮。 EF Core在生成加载相关数据所需的SQL连接时使用关系基数,这可能会在关系未正确映射时导致错误的结果。
修复方法是将MfgSite
中的导航属性替换为
public Scenario Scenario { get; set; }
到
public ICollection<Scenario> Scenarios { get; set; }
从为什么脚手架命令创建了一个错误的关系,我没有数据库模型就无法回答。如果您可以提供重现问题的示例数据库,我建议在EFC问题跟踪器中打开一个问题。