0

搜索从数据网格中选择的项目(在 Guid 上)时,我收到“对象引用未设置为对象的实例”错误。我已经检查过该项目是否正确返回了 Guid(通过将其写入页面上的标签),但是在我的 linq 查询中(我假设)我比较不正确。

ctx 是域数据源,我知道我试图删除的元素存在。

      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

我认为您的问题正在发生,因为您正在创建一个新的MedicineInventory.

替换这个:

MedicineInventory toRemove = new MedicineInventory();

有了这个:

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

更新:

当它返回错误消息“序列不包含元素”时,这是因为 EF 在数据库中找不到与您在where子句中使用的相同 Guid 的行。在这种情况下,为了避免异常,你可以试试这行代码:

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

if如果不是,则使用 an删除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

在任何时候都是空的吗?

toRemove = (from a in ctx.MedicineInventories where (a != null && a.MedicineInventoryId == Mid) select a).Single();
于 2012-10-18T14:50:07.517 回答
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 回答