Почему навигационные свойства возвращаются пустыми? - PullRequest
0 голосов
/ 10 января 2019

У меня есть свойство навигации в классе. Он имеет связь в базе данных, но не возвращает данные от Сотрудники типа Информация Свойство навигации.

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

Информационный класс имеет от 1 до многих отношений с классом 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);
        }

возвращает пустое значение для обеих сущностей

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Info свойство навигации в классе Visa модели настроено неправильно. Вы ссылались на одинарные Info и List<Info>, что не имеет смысла. это должно быть либо Info, либо List<Info>. Но в соответствии с вашими модельными структурами классов, это должно быть List<Info> следующим образом:

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);
 }

Теперь все должно работать нормально!

0 голосов
/ 10 января 2019

Это, вероятно, происходит потому, что Employees не загружаются из базы данных.

Вы можете попытаться использовать С готовностью загружать , прежде чем передавать данные в представление. Или Явная загрузка из Employees для конкретной записи (виза). Если это не сработает, то, возможно, у вас нарушены отношения в вашей модели. Попробуйте перенастроить модель в методе OnModelCreating внутри класса InfoDBContext.

Проверьте эту статью: https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

...