Правильное использование свойства навигации в Entity Framework

Я работаю над формой для добавления нового инвентаря в созданную мной базу данных для отслеживания запасов. Я сделал отображение на EF, и я использую LINQ для EF для запроса данных.

Таблица оборудования имеет свойство навигации EquipmentInventories, Рассмотрим следующий фрагмент кода:

public partial class Content_AddInventoryItems : System.Web.UI.Page
{
    public Equipment equipment;

    protected void Page_Load(object sender, EventArgs e)
    {
        using (MSSInvDBEntities myEntities = new MSSInvDBEntities())
        {
            var manuPop = (from equipment in myEntities.Equipments
                           select equipment.equipmentManu).Distinct();
            ManuList.DataSource = manuPop;
            ManuList.DataBind();
        }
        using (MSSInvDBEntities myEntities = new MSSInvDBEntities())
        {
            var modelPop = from equipment in myEntities.Equipments
                           select equipment.equipmentModel;
            ModelList.DataSource = modelPop;
            ModelList.DataBind();
        }

    }

    private void DisplayEquipmentData()
    {
        ManuList.SelectedValue = equipment.equipmentManu;
        ModelList.SelectedValue = equipment.equipmentModel;
        tboSerial.Text = equipment.EquipmentInventories.serialNumber;

    }
}

Однако я продолжаю получать ошибки, когда я пытаюсь сослаться на serialNumber собственность EquipmentInventories объект с помощью EquipmentInventories навигационное свойство equipment объект.

Есть идеи, где я ошибся?

2 ответа

Решение

Я не вижу, где вы создаете экземпляр своего публичного поля equipment, (equipment в from equipment in... другая переменная, переменная диапазона для запроса LINQ.) Глядя на ваш код, я ожидал NullReferenceException так как equipment является null,

Вы должны иметь что-то вроде:

using (MSSInvDBEntities myEntities = new MSSInvDBEntities())
{
    equipment = (from e in myEntities.Equipments
                 select e)
                .FirstOrDefault();
}

Но это также может вызвать исключение, потому что вы не загружаете equipment.EquipmentInventories собственность и ленивая загрузка не будут работать в вашем DisplayEquipmentData метод, потому что вы уже удалили контекст (автоматически в конце using блок). Ленивая загрузка требует контекста, который еще не уничтожен.

В вашем случае я бы использовал загрузку, хотя:

using (MSSInvDBEntities myEntities = new MSSInvDBEntities())
{
    equipment = (from e in myEntities.Equipments.Include("EquipmentInventories")
                 select e)
                .FirstOrDefault();
}

Затем свойство навигации сразу загружается с этим запросом, и вы можете безопасно распоряжаться контекстом.

Что сказал Слаума, или...

private void DisplayEquipmentData() 
{ 
    ManuList.SelectedValue = equipment.equipmentManu; 
    ModelList.SelectedValue = equipment.equipmentModel; 
    if (!equipment.EquipmentInventoriesReference.IsLoaded)
        equipment.EquipmentInventoriesReference.Load();
    tboSerial.Text = equipment.EquipmentInventories.serialNumber; 

} 
Другие вопросы по тегам