Правильное использование свойства навигации в Entity Framework
Я работаю над формой для добавления нового инвентаря в созданную мной базу данных для отслеживания запасов. Я сделал отображение на EF, и я использую LINQ для 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 ответа
Я не вижу, где вы создаете экземпляр своего публичного поля 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();
}
Затем свойство навигации сразу загружается с этим запросом, и вы можете безопасно распоряжаться контекстом.
Что сказал Слаума, или...
private void DisplayEquipmentData()
{
ManuList.SelectedValue = equipment.equipmentManu;
ModelList.SelectedValue = equipment.equipmentModel;
if (!equipment.EquipmentInventoriesReference.IsLoaded)
equipment.EquipmentInventoriesReference.Load();
tboSerial.Text = equipment.EquipmentInventories.serialNumber;
}