【问题标题】:Why the navigational properties are returned empty?为什么导航属性返回为空?
【发布时间】:2019-01-10 07:35:07
【问题描述】:

我在课堂上有导航属性。它在数据库中有一个关联,但不返回来自 Info 导航属性类型的 Employees 的数据。

 public class Visa
    {
        public int VisaID { get; set; }
        public string VisaName { get; set; }
        public Info EmployeeInfo { get; set; }
        public List<Info> Employees { get; set; }
    }

Info 类与 Visa 类有一对多的关系,也在数据库中。

 public class Info
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string FatherName { get; set; }
    }

在视图中:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.VisaName)

        </td>

            @foreach (var employee in item.Employees)
            {
               <td>@Html.DisplayFor(empItem => employee.Name) </td>
               <td>@Html.DisplayFor(empItem => employee.FatherName)</td>       
            }

        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.VisaID }) |
            @Html.ActionLink("Details", "Details", new { id=item.VisaID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.VisaID })
        </td>
    </tr>
}

item.Employees 为空。为什么?甚至表格中都有数据。

更新:

另外,这不起作用。因此,总体而言,无论出于何种原因,员工都被空置返回。

            InfoDBContext InfoContext = new InfoDBContext();

            object o = InfoContext.Visas.ToList().Where(visa => visa.VisaName == "Visa 1").FirstOrDefault().Employees;
            return View(o);

更新:

这也不行。

  public ActionResult VEmployees() 
        {
            InfoDBContext InfoContext = new InfoDBContext();
            //int EmployeeID = InfoContext.Infoes.ToList().Where(emp => emp.ID == 1).FirstOrDefault().ID;
            object o = InfoContext.Visas.Include(e => e.Employees).Where(v => v.VisaName=="Hunain").FirstOrDefault().Employees;
            return View(o);
        }

两个实体都返回空

【问题讨论】:

  • 应仔细映射这些混合关联。请出示您的 EF 映射。

标签: c# entity-framework model-view-controller entity-framework-6 navigational-properties


【解决方案1】:

这可能是因为Employees 没有从数据库加载。

在将数据传递给视图之前,您可以尝试使用 Eagerly Loading。或显式加载 Employees 用于特定条目(签证)。如果这不起作用,那么您的模型中的关系可能已经破裂。尝试在InfoDBContext 类中的OnModelCreating 方法中重新配置模型。

查看这篇文章:https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

【讨论】:

  • 嗨,谢谢,等等...让我检查一下并回复你。
  • 试试InfoContext.Visas.Include(_ =&gt; _.Employees).Where(...).FirstOrDefault().Employees
  • @Mika Kaskun:请检查更新后的问题。根据您的建议,我尝试了但没有工作。
  • 两个实体都返回空
  • 试试 ToList()? var employees = InfoContext.Visas.Include(_ =&gt; _.Employees).Where(...).FirstOrDefault().Employees.ToList()
【解决方案2】:

Visa 模型类中的Info 导航属性配置不正确。您引用了单个 Info 和 List&lt;Info&gt; 这没有意义。它应该是Info 或List&lt;Info&gt;。但根据您的模型类结构,它似乎应该是List&lt;Info&gt;,如下所示:

public class Visa
{
    public int VisaID { get; set; }
    public string VisaName { get; set; }

    public List<Info> Employees { get; set; }
}

然后编写你的VEmployees方法如下:

public ActionResult VEmployees() 
{
        InfoDBContext infoContext = new InfoDBContext();

        List<Visa> vEmployees = infoContext.Visas.Include(e => e.Employees).Where(v => v.VisaName == "Hunain").ToList();
        return View(vEmployees);
 }

现在一切都应该正常了!

【讨论】:

  • 为什么没有意义? EmployeeInfo 很可能是应用于其他员工的Visa 的所有者(或申请人,或其他)。我觉得还是先问比较好。
  • @是的!有可能!那么你必须正确配置关系!
猜你喜欢
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多