0

我正在制作一个表格,将新库存添加到我设计的库存跟踪数据库中。我已经完成了到 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属性时,我不断收到错误消息。EquipmentInventoriesEquipmentInventoriesequipment

有什么想法我哪里出错了吗?

4

2 回答 2

2

我看不到您在哪里实例化您的 public field equipment。(equipmentinfrom equipment in...是另一个变量,用于 LINQ 查询的范围变量。)查看您的代码,我希望是NullReferenceException因为equipmentis 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();
}

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

于 2012-01-25T21:42:52.647 回答
0

斯劳马说的话,或者……

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

} 
于 2012-01-26T09:10:32.943 回答