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 クエリの範囲変数です。) あなたのコードを見ると、is がNullReferenceException理由であると予想されます。equipmentnull

次のようなものが必要です。

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 に答える