我正在使用表单将新库存添加到我设计的库存跟踪数据库中。我已经完成了到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
属性时,我一直收到错误。
我出错的任何想法?
答案 0 :(得分:2)
我看不到您在哪里实例化公共字段equipment
。 ({1}}中的equipment
是另一个变量,LINQ查询的范围变量。)查看代码我期望from equipment in...
因为NullReferenceException
是equipment
}。
你应该有类似的东西:
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;
}