1

这是我想做的一个非常基本的例子。我想出的代码似乎很冗长......即循环通过集合等。

我正在使用 Telerik MVC 网格,它回发一组已删除、插入和更新的 ViewModel。视图模型与实体相似但不完全相同。

例如......我有:

订单行。Lines 是包含 OrderDetail 记录的实体集合(导航属性)。在使用我的控制器的更新操作中,我有一个从 POST 数据中提取的列表名称 DeletedLines。我还查询了数据库并拥有包含 Lines 集合的 Order 实体。

现在我基本上想告诉它删除 Lines EntityCollection 中的所有 OrderDetails。

我这样做的方式是这样的:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.Where(l => l.Key == line.Key).SingleOrDefault())
}

我希望有一种方法可以使用 .Interset() 来获取要删除的实体集合并将其传递给 DeleteObject .. 但是,DeleteObject 似乎只接受单个实体而不是集合。

也许上面已经足够好了..但似乎应该有一个更简单的方法。

谢谢,鲍勃

4

2 回答 2

2

DeletedLines 中的项目是否附加到上下文?如果是这样,那这个呢?

foreach (var line in DeletedLines) db.DeleteObject(line);

回复评论#1

好的,我现在明白了。您可以使您的代码更短一点,但不多:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.SingleOrDefault(l => l.Key == line.Key))
}

我不确定当您将 DeleteObject 传递为 null 时是否会引发异常。如果是这样,只要您确定该项目在那里,您可能会更好地使用 Single:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.Single(l => l.Key == line.Key))
}
于 2012-01-13T20:39:38.690 回答
0

如果您不想重新查询数据库并且已经拥有映射表 PK 值(或者可以将它们包含在客户端调用中),您可以使用 Alex James 的删除技巧之一,无需先检索:

http://blogs.msdn.com/b/alexj/archive/2009/03/27/tip-9-deleting-an-object-without-retrieving-it.aspx

于 2012-01-14T09:29:39.893 回答