0

データグリッドから選択された (GUID 上の) 項目を検索すると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。項目が Guid を正しく返すことを (ページのラベルに書き込むことによって) 確認しましたが、私の linq クエリでは (私は推測します) 間違って比較しています。

ctx は domaindatasource です。削除しようとしている要素が存在することはわかっています。

      private void medItemRemove_Click(object sender, RoutedEventArgs e)
    {

            MedicineInventory M = (MedicineInventory)medicineInventoryDataGrid.SelectedItem;
            Guid Mid = M.MedicineInventoryId;
            MedicineInventory toRemove = new MedicineInventory();
            toRemove = (from a in ctx.MedicineInventories where (a.MedicineInventoryId == Mid) select a).Single();
            ctx.MedicineInventories.Remove(toRemove);
            ctx.SubmitChanges();

        }
4

3 に答える 3

0

コードを次のように書き換えます。

private void medItemRemove_Click(object sender, RoutedEventArgs e)
{

    MedicineInventory M = (MedicineInventory)medicineInventoryDataGrid.SelectedItem;
    Guid Mid = M.MedicineInventoryId;
    MedicineInventory toRemove = (from a in ctx.MedicineInventories where (a != null && a.MedicineInventoryId == Mid) select a).SingleOrDefault();
    if (toRemove != null){
       ctx.MedicineInventories.Remove(toRemove);
       ctx.SubmitChanges();
    }
    else { .... } // code if toRemove is null

 }
于 2012-10-18T14:50:34.350 に答える
0

新しい を作成しているため、問題が発生していると思いますMedicineInventory

これを置き換えます:

MedicineInventory toRemove = new MedicineInventory();

これとともに:

var toRemove = ctx.MedicineInventories.Single(mi => mi.MedicineInventoryId == Mid);

アップデート:

「シーケンスに要素が含まれていません」というエラー メッセージが返されるのは、where句で使用しているのと同じ Guid を持つ行を EF がデータベース内で見つけることができなかったためです。この場合、例外を回避するために、次のコード行を試すことができます。

var toRemove = ctx.MedicineInventories.SingleOrDefault(
                                                  mi => mi.MedicineInventoryId == Mid);

そうでない場合は、を使用しifて削除しNULLます。

if(toRemove != null)
{
    ctx.MedicineInventories.Remove(toRemove);

    ctx.SubmitChanges();
}
else
{
    // Only you know what to do! :-)
}

SingleOrDefaultシーケンスの唯一の要素を返すNULLか、シーケンスが空の場合はデフォルト値 (この場合) を返します。シーケンスに複数の要素がある場合、このメソッドは例外をスローします。


注: Guid でオーバーロードされているため、Guid を比較する方法は正しいため==、文字列表現を比較する必要はありません。

http://msdn.microsoft.com/en-us/library/system.guid.op_equality%28v=vs.110%29.aspx#Y474を参照してください。

于 2012-10-18T14:48:00.753 に答える
0

どの時点でもnullですか?

toRemove = (from a in ctx.MedicineInventories where (a != null && a.MedicineInventoryId == Mid) select a).Single();
于 2012-10-18T14:50:07.517 に答える