【问题标题】:Properly using the Navigation Property in Entity Framework正确使用实体框架中的导航属性
【发布时间】:2012-01-25 21:20:54
【问题描述】:

我正在制作一个表格,以便将新库存添加到我设计的库存跟踪数据库中。我已经完成了到 EF 的映射,并且正在使用 LINQ to EF 来查询数据。

设备表有一个导航属性EquipmentInventories。考虑下面的 sn-p 代码:

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;

    }
}

但是,当我尝试使用 equipment 对象的 EquipmentInventories 导航属性来引用 EquipmentInventories 对象的 serialNumber 属性时,我不断收到错误消息。

任何想法我哪里出错了?

【问题讨论】:

  • 这是一个 1:N 的关系,你有延迟加载,你得到了什么错误?您需要提供更多信息

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


【解决方案1】:

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

你应该有类似的东西:

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

但这也会导致异常,因为您没有加载 equipment.EquipmentInventories 属性并且延迟加载在您的 DisplayEquipmentData 方法中不起作用,因为您已经处理了上下文(自动在 @ 末尾987654330@ 块)。延迟加载需要一个尚未释放的上下文。

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

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

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

【讨论】:

    【解决方案2】:

    Slauma 说了什么,或者……

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

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2016-05-29
      • 1970-01-01
      相关资源
      最近更新 更多