2012-01-25 3 views
0

Я работаю над формой для добавления нового инвентаря в базу данных отслеживания запасов, которую я разработал. Я сделал сопоставление с EF, и я использую LINQ to EF для запроса данных.Правильное использование свойства Navigation в Entity Framework

Таблица оборудования имеет навигационное свойство 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

Является ли это 1: N отношение, у вас есть отложенная загрузка, какая ошибка поживают? вам нужно предоставить дополнительную информацию –

ответ

2

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

Что сказал Slauma или ...

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

} 
Смежные вопросы