NullReferenceException в модели трех таблиц в Entity Framework - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь объединить три таблицы в модели представления. Он работает с двумя таблицами, но вылетает, когда я добавляю третью. Вот модели и контроллер. Модели section_detail, phone и Department были созданы Entity Framework.

EmployeeViewModel было создано путем копирования свойств из других моделей. Я сократил некоторые из моделей, показанных здесь:

public partial class section_detail
{
    public int section_detail_id { get; set; }
    public Nullable<int> parent_section_det_id { get; set; }
    . . .

    public string Comments { get; set; }
    public string email { get; set; }

    public virtual department department { get; set; }
    public virtual phone phone { get; set; }
}

public partial class phone
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public phone()
    {
        this.section_detail = new HashSet<section_detail>();
    }

    public int phone_id { get; set; }
    public string area_code { get; set; }
    public string phone_nbr { get; set; }
    . . .

    public string activity_code { get; set; }
    public string function_code { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<section_detail> section_detail { get; set; }
    public virtual BudgetUnit BudgetUnit { get; set; }
}

public partial class department
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public department()
    {
        this.section_detail = new HashSet<section_detail>();
    }

    public int dept_id { get; set; }
    public string description { get; set; }
    public string cost_center_code { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<section_detail> section_detail { get; set; }
}

public class EmployeeViewModel
{
    public int section_detail_id { get; set; }
    public Nullable<int> parent_section_det_id { get; set; }
    public Nullable<byte> page_code { get; set; }
    public string cost_center_code { get; set; }
    public string print_descrip { get; set; }
    public Nullable<int> phone_id { get; set; }
    public Nullable<int> employee_id { get; set; }

    public static explicit operator EmployeeViewModel(List<section_detail> v)
    {
        throw new NotImplementedException();
    }

    public string first_name { get; set; }
    . . .
    public string Comments { get; set; }
    public string email { get; set; }
    public string description { get; set; }
    public string area_code { get; set; }
    public string phone_nbr { get; set; }
    public string BU { get; set; }
}

Контроллер:

private vcpds_test1Entities db = new vcpds_test1Entities();

// GET: EmployeeList
public ActionResult Index()
{
    List<section_detail> employeeList = db.section_detail.ToList();

    List<EmployeeViewModel> employeeVMList = employeeList.Where(emp => emp.page_code == 3)
            .Select(emp => new EmployeeViewModel
            {
                last_name = emp.last_name,
                first_name = emp.first_name,
                employee_id = emp.employee_id,
                phone_nbr = "(" + emp.phone.area_code + ") " + emp.phone.phone_nbr.Substring(0, 3) + "-" + emp.phone.phone_nbr.Substring(3, 4),
                BU = emp.phone.BU,
                description = emp.department.description,
                page_code = emp.page_code
            }).OrderBy(emp => emp.last_name).ThenBy(emp => emp.first_name).ToList();

    return View(employeeVMList);
}

Я получаю следующие сообщения:

System.NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта.'
VCPDS2.Models.section_detail.department.get вернул null.

Если я закомментирую description = emp.department.description из контроллера, то он вернет данные из таблиц section_detail и phone. Я проверил базу данных, и отношения, кажется, в порядке. Я попытался обновить модели из базы данных без изменений.

1 Ответ

0 голосов
/ 01 апреля 2020

Возможно, что у emp нет отдела, поэтому он сам по себе равен нулю. Описание не может быть свойством null. Итак, что вы можете просто сделать, это проверить, является ли оно нулевым, с помощью оператора null:

...

//description = emp.department.description,
description = emp.department?.description ?? "",

...

По сути, если само отделение имеет значение null, оно сразу же прекратит проверку, и ?? для быстрого доступа используйте оператор справа, который равен "", если оператор слева равен нулю.

Если вы не ожидали, что у emp нет отдела, вам может потребоваться пересмотреть запрос

Быстрое редактирование: вам, вероятно, нужно использовать Включить в ваш запрос, чтобы оно могло привести свойства отдела (для описания):

        List<section_detail> employeeList = db.section_detail
            .Include(x => x.department)
            .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...