Правильное использование свойства навигации в Entity Framework - PullRequest
0 голосов
/ 26 января 2012

Я работаю над формой добавления нового инвентаря в созданную мной базу данных для отслеживания запасов.Я сделал сопоставление с 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 ]

2 голосов
/ 26 января 2012

Я не вижу, где вы создаете экземпляр своего открытого поля 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();
}

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

0 голосов
/ 26 января 2012

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

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

} 
...