实体框架将子对象设置为null

时间:2017-09-29 23:05:48

标签: entity-framework-core asp.net-core-2.0

我对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());
}

在视图中显示时(并非显示所有列),它看起来像这样: enter image description here

空列是因为s.MfgSiteU为空,即使s.MfgSiteUid准确且不为空。 MfgSiteCommonName应该是第二行的“Test Site 1”和第三行和第四行的“Test Site 2”。

什么可能导致此问题以及可能的修复方法是什么?作为调试的一部分,我尝试使用DbSet上的foreach一次导航一个场景,并手动将每个场景添加到List。我可以看到MfgSiteU在各个上面都不是空的,但是有些如何在我迭代结束时将之前的那些重置为null。

1 个答案:

答案 0 :(得分:2)

  

什么可能导致此问题以及可能的修复方法是什么?

问题在于,根据示例数据,ScenarioMfgSite之间的关系是多对一,而生成的关系是一-to酮。 EF Core在生成加载相关数据所需的SQL连接时使用关系基数,这可能会在关系未正确映射时导致错误的结果。

修复方法是将MfgSite中的导航属性替换为

public Scenario Scenario { get; set; }

public ICollection<Scenario> Scenarios { get; set; }

为什么脚手架命令创建了一个错误的关系,我没有数据库模型就无法回答。如果您可以提供重现问题的示例数据库,我建议在EFC问题跟踪器中打开一个问题。