正确使用实体框架中的导航属性

时间:2012-01-25 21:20:54

标签: asp.net entity-framework navigation-properties

我正在使用表单将新库存添加到我设计的库存跟踪数据库中。我已经完成了到EF的映射,我正在使用LINQ to 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 个答案:

答案 0 :(得分:2)

我看不到您在哪里实例化公共字段equipment。 ({1}}中的equipment是另一个变量,LINQ查询的范围变量。)查看代码我期望from equipment in...因为NullReferenceExceptionequipment }。

你应该有类似的东西:

null

但是这也会导致异常,因为你没有加载using (MSSInvDBEntities myEntities = new MSSInvDBEntities()) { equipment = (from e in myEntities.Equipments select e) .FirstOrDefault(); } 属性,延迟加载在equipment.EquipmentInventories方法中不起作用,因为你已经处理了上下文(自动在DisplayEquipmentData块的结尾)。延迟加载需要一个尚未处理的上下文。

在你的情况下,我会使用急切加载:

using

然后使用此查询立即加载导航属性,您可以安全地处理上下文。

答案 1 :(得分:0)

Slauma说了什么,或者......

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

}